2015-04-26 4 views
0

Я только что преобразовал программное обеспечение Netty 3 в 5, и у меня возникла проблема. С одним клиентом все в порядке. Я могу использовать оба декодера (они правильно переключаются) и позволяют мне войти в систему.Netty 5, несколько клиентов

Проблема возникает, когда я пытаюсь подключить другого клиента, независимо от того, подключен ли первый клиент или нет. Первый клиент остается подключенным абсолютно нормально, но второй клиент не может подключиться вообще (не прошел первый декодер).

Apr 26, 2015 4:51:16 AM io.netty.channel.ChannelHandlerInvokerUtil notifyOutboundHandlerException 
WARNING: Failed to fail the promise because it's done already: [email protected](failure(io.netty.util.IllegalReferenceCountException: refCnt: 0) 
io.netty.util.IllegalReferenceCountException: refCnt: 0, decrement: 1 
    at io.netty.buffer.AbstractReferenceCountedByteBuf.release(AbstractReferenceCountedByteBuf.java:111) 
    at io.netty.util.ReferenceCountUtil.release(ReferenceCountUtil.java:84) 
    at io.netty.channel.AbstractChannel$AbstractUnsafe.write(AbstractChannel.java:791) 
    at io.netty.channel.DefaultChannelPipeline$HeadContext.write(DefaultChannelPipeline.java:1278) 
    at io.netty.channel.ChannelHandlerInvokerUtil.invokeWriteNow(ChannelHandlerInvokerUtil.java:158) 
    at io.netty.channel.DefaultChannelHandlerInvoker.invokeWrite(DefaultChannelHandlerInvoker.java:337) 
    at io.netty.channel.PausableChannelEventExecutor.invokeWrite(PausableChannelEventExecutor.java:132) 
    at io.netty.channel.AbstractChannelHandlerContext.write(AbstractChannelHandlerContext.java:539) 
    at io.netty.handler.timeout.IdleStateHandler.write(IdleStateHandler.java:267) 
    at io.netty.channel.ChannelHandlerInvokerUtil.invokeWriteNow(ChannelHandlerInvokerUtil.java:158) 
    at io.netty.channel.DefaultChannelHandlerInvoker.invokeWrite(DefaultChannelHandlerInvoker.java:337) 
    at io.netty.channel.PausableChannelEventExecutor.invokeWrite(PausableChannelEventExecutor.java:132) 
    at io.netty.channel.AbstractChannelHandlerContext.write(AbstractChannelHandlerContext.java:539) 
    at io.netty.channel.ChannelHandlerAdapter.write(ChannelHandlerAdapter.java:265) 
    at io.netty.channel.ChannelHandlerInvokerUtil.invokeWriteNow(ChannelHandlerInvokerUtil.java:158) 
    at io.netty.channel.DefaultChannelHandlerInvoker$WriteTask.run(DefaultChannelHandlerInvoker.java:440) 
    at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:328) 
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:354) 
    at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:116) 
    at io.netty.util.internal.chmv8.ForkJoinTask$RunnableExecuteAction.exec(ForkJoinTask.java:1412) 
    at io.netty.util.internal.chmv8.ForkJoinTask.doExec(ForkJoinTask.java:280) 
    at io.netty.util.internal.chmv8.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:877) 
    at io.netty.util.internal.chmv8.ForkJoinPool.scan(ForkJoinPool.java:1706) 
    at io.netty.util.internal.chmv8.ForkJoinPool.runWorker(ForkJoinPool.java:1661) 
    at io.netty.util.internal.chmv8.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:126) 

Вот мой самозагрузки:

EventLoopGroup bossGroup = new NioEventLoopGroup(); 
     EventLoopGroup workerGroup = new NioEventLoopGroup(); 
     ServerBootstrap b = new ServerBootstrap(); 
     b.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class) 
       .option(ChannelOption.SO_REUSEADDR, true) 
       .childOption(ChannelOption.SO_KEEPALIVE, true) 
       .childOption(ChannelOption.TCP_NODELAY, true) 
       .localAddress(43594) 
       .childHandler(new ChannelInitializer<SocketChannel>() { 
        @Override 
        public void initChannel(SocketChannel ch) throws Exception { 
         ChannelPipeline p = ch.pipeline(); 
         p.addLast("timeout", new IdleStateHandler(15, 0, 0)); 
         p.addLast("decoder", new RS2Decoder()); 
         p.addLast("handler", new ChannelHandler()); 
        } 
       } 
     ).bind(); 

Первый декодер:

http://pastebin.com/9FWzXSVE

Второй декодер:

http://pastebin.com/n2D8RDgn

И мой обработчик канала:

http://pastebin.com/4mdXe5jV

ответ

1

Решение пометить обработчик, как Sharable через @Sharable аннотацию.