Vincenzo Galluccio created CAMEL-18027:
------------------------------------------

             Summary: camel-netty - 
                 Key: CAMEL-18027
                 URL: https://issues.apache.org/jira/browse/CAMEL-18027
             Project: Camel
          Issue Type: Bug
          Components: camel-netty
    Affects Versions: 3.16.0, 3.14.2
            Reporter: Vincenzo Galluccio
             Fix For: 3.14.3, 3.17.0


The Camel Netty component (NettyProducer) is wrongly closing TCP/IP client 
channels when the {{requestTimeout}} option is configured.

See logs:

 
{code:java}
2022-04-21 15:21:46.410  INFO 18420 --- [           main] 
o.a.c.component.netty.NettyComponent     : Creating shared 
NettyConsumerExecutorGroup with 17 threads
2022-04-21 15:21:46.683 DEBUG 18420 --- [           main] 
o.a.camel.component.netty.NettyProducer  : Created NettyProducer 
pool[maxTotal=1, minIdle=100, maxIdle=100, minEvictableIdleDuration=PT-0.001S] 
-> GenericObjectPool [maxTotal=1, blockWhenExhausted=true, 
maxWaitDuration=PT-0.001S, lifo=true, fairness=false, testOnCreate=false, 
testOnBorrow=true, testOnReturn=false, testWhileIdle=true, 
durationBetweenEvictionRuns=PT30S, numTestsPerEvictionRun=3, 
minEvictableIdleTimeDuration=PT-0.001S, 
softMinEvictableIdleTimeDuration=PT-0.001S, 
evictionPolicy=org.apache.commons.pool2.impl.DefaultEvictionPolicy@580d3612, 
closeLock=java.lang.Object@5b0039aa, closed=false, 
evictionLock=java.lang.Object@52bf5065, 
evictor=org.apache.commons.pool2.impl.BaseGenericObjectPool$Evictor@263cece5, 
evictionIterator=null, factoryClassLoader=java.lang.ref.WeakReference@1730f396, 
oname=org.apache.commons.pool2:type=GenericObjectPool,name=pool, 
creationStackTrace=java.lang.Exception
[...]
, borrowedCount=0, returnedCount=0, createdCount=0, destroyedCount=0, 
destroyedByEvictorCount=0, destroyedByBorrowValidationCount=0, 
activeTimes=StatsStore [[]], size=100, index=0], idleTimes=StatsStore [[]], 
size=100, index=0], waitTimes=StatsStore [[]], size=100, index=0], 
maxBorrowWaitDuration=PT0S, swallowedExceptionListener=null, factoryType=null, 
maxIdle=100, minIdle=0, 
factory=org.apache.camel.component.netty.NettyProducer$NettyProducerPoolableObjectFactory@4d2745b3,
 allObjects={}, createCount=0, idleObjects=[], abandonedConfig=null]
2022-04-21 15:51:11.502 TRACE 18420 --- [roducerTemplate] 
o.a.camel.component.netty.NettyProducer  : Pool[active=0, idle=0]
2022-04-21 15:51:11.504 DEBUG 18420 --- [roducerTemplate] 
o.a.camel.component.netty.NettyProducer  : Created new TCP client bootstrap 
connecting to localhost:19001 with options: Bootstrap(BootstrapConfig(group: 
NioEventLoopGroup, channelFactory: 
ReflectiveChannelFactory(NioSocketChannel.class), options: {SO_KEEPALIVE=true, 
SO_REUSEADDR=true, TCP_NODELAY=true, CONNECT_TIMEOUT_MILLIS=2000}, handler: 
org.apache.camel.component.netty.DefaultClientInitializerFactory@624ce9ff, 
resolver: io.netty.resolver.DefaultAddressResolverGroup@6e4616a3))
2022-04-21 15:51:11.505 TRACE 18420 --- [roducerTemplate] 
o.a.camel.component.netty.NettyProducer  : Requested channel: 
AbstractBootstrap$PendingRegistrationPromise@270856c0(incomplete)
2022-04-21 15:51:11.505 TRACE 18420 --- [roducerTemplate] 
o.a.camel.component.netty.NettyProducer  : activateObject channel request: 
AbstractBootstrap$PendingRegistrationPromise@270856c0(incomplete)
2022-04-21 15:51:11.505 TRACE 18420 --- [roducerTemplate] 
o.a.camel.component.netty.NettyProducer  : Validating connecting channel 
request: AbstractBootstrap$PendingRegistrationPromise@270856c0(incomplete) -> 
true
2022-04-21 15:51:11.505 TRACE 18420 --- [roducerTemplate] 
o.a.camel.component.netty.NettyProducer  : Got channel request from pool 
AbstractBootstrap$PendingRegistrationPromise@270856c0(incomplete)
2022-04-21 15:51:11.509 DEBUG 18420 --- [ClientTCPWorker] 
.a.c.c.n.DefaultClientInitializerFactory : Client SSL handler configured and 
added to the ChannelPipeline: io.netty.handler.ssl.SslHandler@735dd507
2022-04-21 15:51:11.509 TRACE 18420 --- [ClientTCPWorker] 
.a.c.c.n.DefaultClientInitializerFactory : Using request timeout 5000 millis
2022-04-21 15:51:11.509 TRACE 18420 --- [ClientTCPWorker] 
.a.c.c.n.DefaultClientInitializerFactory : Created ChannelPipeline: 
DefaultChannelPipeline{(DefaultClientInitializerFactory#0 = 
org.apache.camel.component.netty.DefaultClientInitializerFactory), (ssl = 
io.netty.handler.ssl.SslHandler), (decoder-0 = 
io.netty.handler.codec.LengthFieldBasedFrameDecoder), (decoder-1 = 
util.SharableByteArrayDecoder), (encoder-0 = 
io.netty.handler.codec.LengthFieldPrepender), (encoder-1 = 
io.netty.handler.codec.bytes.ByteArrayEncoder), (timeout = 
io.netty.handler.timeout.ReadTimeoutHandler), (handler = 
org.apache.camel.component.netty.handlers.ClientChannelHandler)}
2022-04-21 15:51:11.511 TRACE 18420 --- [ClientTCPWorker] 
o.a.camel.component.netty.NettyProducer  : Channel open finished with 
AbstractBootstrap$PendingRegistrationPromise@270856c0(success)
2022-04-21 15:51:11.511 DEBUG 18420 --- [ClientTCPWorker] 
o.a.camel.component.netty.NettyProducer  : Creating connector to address: 
localhost:19001
2022-04-21 15:51:11.511 DEBUG 18420 --- [ClientTCPWorker] 
o.a.camel.component.netty.NettyProducer  : Channel: [id: 0x80278f7c, 
L:/127.0.0.1:61770 - R:localhost/127.0.0.1:19001] writing body: OMITTED
2022-04-21 15:51:11.517 TRACE 18420 --- [ClientTCPWorker] 
o.a.camel.component.netty.NettyProducer  : Channel open: [id: 0x80278f7c, 
L:/127.0.0.1:61770 - R:localhost/127.0.0.1:19001]
2022-04-21 15:51:11.637 TRACE 18420 --- [ClientTCPWorker] 
o.a.camel.component.netty.NettyProducer  : Operation complete 
DefaultChannelPromise@1835894c(success)
2022-04-21 15:51:11.642 TRACE 18420 --- [ClientTCPWorker] 
o.a.camel.component.netty.NettyProducer  : Message received: OMITTED
2022-04-21 15:51:11.642 TRACE 18420 --- [ClientTCPWorker] 
o.a.camel.component.netty.NettyProducer  : Removing timeout channel as we 
received message
2022-04-21 15:51:11.642 DEBUG 18420 --- [ClientTCPWorker] 
o.a.camel.component.netty.NettyProducer  : Channel: [id: 0x80278f7c, 
L:/127.0.0.1:61770 - R:localhost/127.0.0.1:19001] received body: OMITTED
2022-04-21 15:51:11.643 TRACE 18420 --- [ClientTCPWorker] 
o.a.camel.component.netty.NettyProducer  : Putting channel back to pool [id: 
0x80278f7c, L:/127.0.0.1:61770 - R:localhost/127.0.0.1:19001]
2022-04-21 15:51:11.643 TRACE 18420 --- [ClientTCPWorker] 
o.a.camel.component.netty.NettyProducer  : passivateObject channel request: 
AbstractBootstrap$PendingRegistrationPromise@270856c0(success)
2022-04-21 15:51:11.645 DEBUG 18420 --- [nio-8087-exec-5] 
eHttpServletFilter$AsyncExceptionHandler : handling on complete for async event
2022-04-21 15:51:16.770 TRACE 18420 --- [ns-pool-evictor] 
o.a.camel.component.netty.NettyProducer  : activateObject channel request: 
AbstractBootstrap$PendingRegistrationPromise@270856c0(success)
2022-04-21 15:51:16.771 TRACE 18420 --- [ns-pool-evictor] 
o.a.camel.component.netty.NettyProducer  : reset the request timeout as we 
activate the channel
2022-04-21 15:51:16.771 TRACE 18420 --- [ns-pool-evictor] 
o.a.camel.component.netty.NettyProducer  : Validating channel: [id: 0x80278f7c, 
L:/127.0.0.1:61770 - R:localhost/127.0.0.1:19001] -> true
2022-04-21 15:51:16.771 TRACE 18420 --- [ns-pool-evictor] 
o.a.camel.component.netty.NettyProducer  : passivateObject channel request: 
AbstractBootstrap$PendingRegistrationPromise@270856c0(success)
2022-04-21 15:51:21.771 TRACE 18420 --- [ClientTCPWorker] 
o.a.camel.component.netty.NettyProducer  : Exception caught at Channel: [id: 
0x80278f7c, L:/127.0.0.1:61770 - R:localhost/127.0.0.1:19001]
io.netty.handler.timeout.ReadTimeoutException: null
2022-04-21 15:51:21.772 DEBUG 18420 --- [ClientTCPWorker] 
o.a.camel.component.netty.NettyProducer  : Closing channel as an exception was 
thrown from Netty
io.netty.handler.timeout.ReadTimeoutException: null
2022-04-21 15:51:21.772 TRACE 18420 --- [ClientTCPWorker] 
o.a.camel.component.netty.NettyHelper    : Channel closed: [id: 0x80278f7c, 
L:/127.0.0.1:61770 ! R:localhost/127.0.0.1:19001]
2022-04-21 15:51:21.773 TRACE 18420 --- [ClientTCPWorker] 
o.a.camel.component.netty.NettyProducer  : Channel closed: [id: 0x80278f7c, 
L:/127.0.0.1:61770 ! R:localhost/127.0.0.1:19001]
2022-04-21 15:51:46.773 TRACE 18420 --- [ns-pool-evictor] 
o.a.camel.component.netty.NettyProducer  : activateObject channel request: 
AbstractBootstrap$PendingRegistrationPromise@270856c0(success)
2022-04-21 15:51:46.773 TRACE 18420 --- [ns-pool-evictor] 
o.a.camel.component.netty.NettyProducer  : reset the request timeout as we 
activate the channel
2022-04-21 15:51:46.773 TRACE 18420 --- [ns-pool-evictor] 
o.a.camel.component.netty.NettyProducer  : Destroying channel request: 
AbstractBootstrap$PendingRegistrationPromise@270856c0(success)
{code}
 

The offending code seems to be: 
[https://github.com/apache/camel/blob/main/components/camel-netty/src/main/java/org/apache/camel/component/netty/NettyProducer.java]



 
{code:java}
        @Override
        public void activateObject(PooledObject<ChannelFuture> p) throws 
Exception {
            ChannelFuture channelFuture = p.getObject();
            LOG.trace("activateObject channel request: {}", channelFuture);
            if (channelFuture.isSuccess() && 
producer.getConfiguration().getRequestTimeout() > 0) {
                LOG.trace("reset the request timeout as we activate the 
channel");
                Channel channel = channelFuture.channel();
                ChannelHandler handler = channel.pipeline().get("timeout");
                if (handler == null) {
                    ChannelHandler timeout
                            = new 
ReadTimeoutHandler(producer.getConfiguration().getRequestTimeout(), 
TimeUnit.MILLISECONDS);
                    channel.pipeline().addBefore("handler", "timeout", timeout);
                }
            }
        }
{code}
 



--
This message was sent by Atlassian Jira
(v8.20.7#820007)

Reply via email to