[
https://issues.apache.org/jira/browse/CAMEL-20124?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Claus Ibsen resolved CAMEL-20124.
---------------------------------
Resolution: Fixed
> camel-netty - Fix ChannelHandlerFactories' usage of unsharable
> ByteArrayDecoder
> -------------------------------------------------------------------------------
>
> Key: CAMEL-20124
> URL: https://issues.apache.org/jira/browse/CAMEL-20124
> Project: Camel
> Issue Type: Bug
> Components: camel-netty
> Reporter: Kengo Seki
> Assignee: Kengo Seki
> Priority: Minor
> Fix For: 4.0.4, 4.3.0
>
>
> Recently I tried to set up a simple TCP proxy relaying any byte stream
> leveraging the Netty component, just like:
> {code}
> ///usr/bin/env jbang "$0" "$@" ; exit $?
> //DEPS org.apache.camel:camel-bom:4.2.0@pom
> //DEPS org.apache.camel:camel-core
> //DEPS org.apache.camel:camel-main
> //DEPS org.apache.camel:camel-netty
> //DEPS org.apache.camel:camel-support
> import org.apache.camel.builder.RouteBuilder;
> import org.apache.camel.component.netty.ChannelHandlerFactories;
> import org.apache.camel.main.Main;
> import org.apache.camel.support.DefaultRegistry;
> class proxy {
> public static void main(String... args) throws Exception {
> Main main = new Main();
> main.configure().addRoutesBuilder(new RouteBuilder() {
> public void configure() throws Exception {
> DefaultRegistry registry = (DefaultRegistry)
> getContext().getRegistry();
> registry.bind("bytesDecoder",
> ChannelHandlerFactories.newByteArrayDecoder("tcp"));
> registry.bind("bytesEncoder",
> ChannelHandlerFactories.newByteArrayEncoder("tcp"));
>
> from("netty:tcp://0.0.0.0:1234?decoders=#bytesDecoder&encoders=#bytesEncoder")
>
> .to("netty:tcp://localhost:5678?decoders=#bytesDecoder&encoders=#bytesEncoder")
> ;
> }
> });
> main.run();
> }
> }
> {code}
> But sending data through this proxy fails with the following messages, and
> the client doesn't get any response:
> {code}
> WARNING: Failed to initialize a channel. Closing: [id: 0x45bcede1]
> 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:600)
> at
> io.netty.channel.DefaultChannelPipeline.addLast(DefaultChannelPipeline.java:202)
> at
> io.netty.channel.DefaultChannelPipeline.addLast(DefaultChannelPipeline.java:195)
> at
> org.apache.camel.component.netty.DefaultClientInitializerFactory.addToPipeline(DefaultClientInitializerFactory.java:102)
> at
> org.apache.camel.component.netty.DefaultClientInitializerFactory.initChannel(DefaultClientInitializerFactory.java:72)
> ...
> {code}
> This is because [{{ChannelHandlerFactories}} wraps {{ByteArrayDecoder}} with
> {{ShareableChannelHandlerFactory}}|https://github.com/apache/camel/blob/camel-4.2.0/components/camel-netty/src/main/java/org/apache/camel/component/netty/ChannelHandlerFactories.java#L110],
> but [it's not actually sharable (doesn't have a {{@ChannelHandler.Sharable}}
> annotation)|https://github.com/netty/netty/blob/netty-4.1.100.Final/codec/src/main/java/io/netty/handler/codec/bytes/ByteArrayDecoder.java#L52].
> A factory class that returns a new {{ByteArrayDecoder}} instance for each
> {{newByteArrayDecoder()}} call is required here, [as the document
> explained|https://camel.apache.org/components/4.0.x/netty-component.html#_using_non_shareable_encoders_or_decoders].
--
This message was sent by Atlassian Jira
(v8.20.10#820010)