Apache camel ByteArrayCoder不是@Sharable处理程序,因此无法多次添加或删除

Apache camel ByteArrayCoder不是@Sharable处理程序,因此无法多次添加或删除,apache-camel,netty,Apache Camel,Netty,我正在尝试运行简单的echo服务器进行性能测试。我为自己的目的设置了netty4 tcp端点和ByteArrayCoder。当只创建一个/一次soket时,一切正常。当我想连接第二个客户端或重新连接第一个客户端时,我不断地得到以下错误: 2015-12-03 14:58:08,218 | WARN | yServerTCPWorker | ChannelInitializer | 175 - io.netty.common - 4.0.27.Final | Fail

我正在尝试运行简单的echo服务器进行性能测试。我为自己的目的设置了netty4 tcp端点和ByteArrayCoder。当只创建一个/一次soket时,一切正常。当我想连接第二个客户端或重新连接第一个客户端时,我不断地得到以下错误:

2015-12-03 14:58:08,218 | WARN  | yServerTCPWorker | ChannelInitializer               | 175 - io.netty.common - 4.0.27.Final | Failed to initialize a channel. Closing: [id: 0xe9f9fb16, /127.0.0.1:6056
3 => /127.0.0.1:1542]
io.netty.channel.ChannelPipelineException: io.netty.handler.codec.bytes.ByteArrayDecoder is not a @Sharable handler, so can't be added or removed multiple times.
    at io.netty.channel.DefaultChannelPipeline.checkMultiplicity(DefaultChannelPipeline.java:464)[178:io.netty.transport:4.0.27.Final]
    at io.netty.channel.DefaultChannelPipeline.addLast0(DefaultChannelPipeline.java:136)[178:io.netty.transport:4.0.27.Final]
    at io.netty.channel.DefaultChannelPipeline.addLast(DefaultChannelPipeline.java:129)[178:io.netty.transport:4.0.27.Final]
    at io.netty.channel.DefaultChannelPipeline.addLast(DefaultChannelPipeline.java:120)[178:io.netty.transport:4.0.27.Final]
    at org.apache.camel.component.netty4.DefaultServerInitializerFactory.addToPipeline(DefaultServerInitializerFactory.java:118)[83:org.apache.camel.camel-netty4:2.16.0]
    at org.apache.camel.component.netty4.DefaultServerInitializerFactory.initChannel(DefaultServerInitializerFactory.java:100)[83:org.apache.camel.camel-netty4:2.16.0]
    at io.netty.channel.ChannelInitializer.channelRegistered(ChannelInitializer.java:69)[178:io.netty.transport:4.0.27.Final]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRegistered(AbstractChannelHandlerContext.java:162)[178:io.netty.transport:4.0.27.Final]
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRegistered(AbstractChannelHandlerContext.java:148)[178:io.netty.transport:4.0.27.Final]
    at io.netty.channel.DefaultChannelPipeline.fireChannelRegistered(DefaultChannelPipeline.java:734)[178:io.netty.transport:4.0.27.Final]
    at io.netty.channel.AbstractChannel$AbstractUnsafe.register0(AbstractChannel.java:450)[178:io.netty.transport:4.0.27.Final]
    at io.netty.channel.AbstractChannel$AbstractUnsafe.access$100(AbstractChannel.java:378)[178:io.netty.transport:4.0.27.Final]
    at io.netty.channel.AbstractChannel$AbstractUnsafe$1.run(AbstractChannel.java:424)[178:io.netty.transport:4.0.27.Final]
    at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:357)[175:io.netty.common:4.0.27.Final]
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:357)[178:io.netty.transport:4.0.27.Final]
    at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:111)[175:io.netty.common:4.0.27.Final]
    at java.lang.Thread.run(Thread.java:745)[:1.8.0_25]
我和ByteArrayDecoder打交道,发现它无论如何都是@Sharable。虽然我创建了factory,它应该返回ByteArrayCoder的新实例,但它也没有帮助。我比较了Karaf上依赖模块的版本,似乎它们是相同的

在我的蓝图下面

<!--bean id="decoder" class="io.netty.handler.codec.bytes.ByteArrayDecoder"/-->

<!--bean id="decoder" class="com.company.feature.ChannelHandlerFactoryByteArrayDecoder" factory-method="newChannelHandler"/-->
<bean id="factory" class="com.company.feature.ChannelHandlerFactoryByteArrayDecoder" />
<bean id="decoder" class="io.netty.handler.codec.bytes.ChannelInboundHandlerAdapter" factory-ref="factory" factory-method="newChannelHandler"/>

<bean id="process" class="com.company.feature.Process"/>

<camelContext id="camel_netty_tcp_test" xmlns="http://camel.apache.org/schema/blueprint" allowUseOriginalMessage="false">  

    <route id="featureRoute">
        <from uri="{{feature.in_route}}"/>
        <process ref="process"/>
        <log message="Received"/>
    </route>
</camelContext>

为了暂时避免这个错误,我继承了ByteArrayDecoder类,并按如下方式实现它

import io.netty.channel.ChannelHandler;
import io.netty.handler.codec.bytes.ByteArrayDecoder;


@ChannelHandler.Sharable
public class MyByteArrayDecoder extends ByteArrayDecoder {

}

在工厂中回复退货类型后,一切都开始工作。

这对我很有帮助。。谢谢
import io.netty.channel.ChannelHandler;
import io.netty.handler.codec.bytes.ByteArrayDecoder;


@ChannelHandler.Sharable
public class MyByteArrayDecoder extends ByteArrayDecoder {

}