[ https://issues.apache.org/activemq/browse/CAMEL-2713?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=59412#action_59412 ]
Christian Mueller commented on CAMEL-2713: ------------------------------------------ May be I was a little vague with my description. In [1.7.3. The Second Solution |http://docs.jboss.org/netty/3.1/guide/html_single/index.html#d0e1062] in the Netty documentation it's a sample, in which the FrameDecoder is used: {code} package org.jboss.netty.example.time; public class TimeDecoder extends FrameDecoder { @Override protected Object decode( ChannelHandlerContext ctx, Channel channel, ChannelBuffer buffer) { if (buffer.readableBytes() < 4) { return null; } return buffer.readBytes(4); } } {code} The FrameDecoder has the annotation @ChannelPipelineCoverage("one")) which means it is state full. This means, you cannot share an instance of the FrameDecoder in multiple channels. The guided solution for this is to use a ChannelPipelineFactory and create a new instance of the FrameDecoder for each channel: {code} package org.jboss.netty.example.time; public class TimeClientPipelineFactory implements ChannelPipelineFactory { public ChannelPipeline getPipeline() { ChannelPipeline pipeline = Channels.pipeline(); pipeline.addLast("handler", new TimeClientHandler()); return pipeline; } } {code} I think this is the same for the encoders and decoders... In Camel Netty the handler, encoder and decoder are all shared which not fits the needs described before. {code} List<ChannelUpstreamHandler> decoders = producer.getConfiguration().getDecoders(); for (int x = 0; x < decoders.size(); x++) { channelPipeline.addLast("decoder-" + x, decoders.get(x)); } List<ChannelDownstreamHandler> encoders = producer.getConfiguration().getEncoders(); for (int x = 0; x < encoders.size(); x++) { channelPipeline.addLast("encoder-" + x, encoders.get(x)); } if (producer.getConfiguration().getHandler() != null) { channelPipeline.addLast("handler", producer.getConfiguration().getHandler()); } else { channelPipeline.addLast("handler", new ClientChannelHandler(producer)); } {code} Please let me know, if I'm right or not. Thanks, Christian > camel-netty: Add a registry based option for a custom ChannelPipelineFactory > ---------------------------------------------------------------------------- > > Key: CAMEL-2713 > URL: https://issues.apache.org/activemq/browse/CAMEL-2713 > Project: Apache Camel > Issue Type: Improvement > Affects Versions: 2.3.0 > Environment: All > Reporter: Christian Mueller > Fix For: 2.4.0 > > > We will build an ims-component to communicate with our > [IMS|http://en.wikipedia.org/wiki/Information_Management_System] system. > As described in the Netty documentation in chapter [1.7.2. The First > Solution|http://docs.jboss.org/netty/3.1/guide/html_single/index.html#d0e865], > I assume that we need a state full SimpleChannelHandler (class annotated > with @ChannelPipelineCoverage("one")). The proposed solution is to use a > ChannelPipelineFactory which creates a new ChannelPipeline and a new > SimpleChannelHandler for each Channel. > {code} > public class TimeClientPipelineFactory implements ChannelPipelineFactory { > public ChannelPipeline getPipeline() { > ChannelPipeline pipeline = Channels.pipeline(); > pipeline.addLast("handler", new TimeClientHandler()); > return pipeline; > } > } > {code} > In the current implementation, this is not possible IMO. The custom handler, > which is looked up from the registry, is shared between all channels: > {code} > channelPipeline.addLast("handler", > consumer.getConfiguration().getHandler()); > {code} > If I'm right, I would like to provide the patch (but unfortunately not in the > next two weeks). > Thanks, > Christian > P.S: Very nice/clean code inside this component... :-) -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online.