Failover loadbalancing between cxf endpoints results in IllegalStateException:
Already connected
------------------------------------------------------------------------------------------------
Key: CAMEL-3698
URL: https://issues.apache.org/jira/browse/CAMEL-3698
Project: Camel
Issue Type: Bug
Components: camel-core, camel-cxf
Affects Versions: 2.6.0
Reporter: Martijn van Ginkel
I have configured a route with a failover loadbalancer using camel 2.6.0 and
cxf 2.3.2 as follows:
{code:xml}
<camelContext id="camelContext" xmlns="http://camel.apache.org/schema/spring"
trace="true" autoStartup="true">
<route>
<from uri="cxf:bean:entryEndpoint" />
<loadBalance>
<failover>
<exception>java.lang.Throwable</exception>
</failover>
<to uri="cxf:bean:targetEndpoint1" />
<to uri="cxf:bean:targetEndpoint2" />
</loadBalance>
</route>
</camelContext>{code}
We have configured two soap services at a local Tomcat, targetEnpoint1 and 2.
If 'targetEndpoint1' is stopped (resulting in a 404), I expect the message to
fail over to 'targetEndpoint2'. When I switch of the service at
'targetEndpoint1', executing the route results in a IllegalStateException:
{code}
2011-02-21 16:45:24,430 [ERROR] Logger - Failed delivery for exchangeId:
ID-MartijnvG-HP-19759-1298303117555-0-2. Exhausted after delivery attempt: 1
caught: java.lang.IllegalStateException: IllegalStateException invoking
http://localhost:8080/echo2/echo: Already connected
java.lang.IllegalStateException: IllegalStateException invoking
http://localhost:8080/echo2/echo: Already connected
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown
Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at
org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.mapException(HTTPConduit.java:2107)
at
org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:2097)
at
org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56)
at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:697)
at
org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62)
at
org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:255)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:454)
at
org.apache.camel.component.cxf.CxfProducer.process(CxfProducer.java:94)
at
org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:70)
at
org.apache.camel.processor.SendProcessor$2.doInAsyncProducer(SendProcessor.java:104)
at
org.apache.camel.impl.ProducerCache.doInAsyncProducer(ProducerCache.java:272)
at
org.apache.camel.processor.SendProcessor.process(SendProcessor.java:98)
at
org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:70)
at
org.apache.camel.processor.DelegateAsyncProcessor.processNext(DelegateAsyncProcessor.java:98)
at
org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:89)
at
org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:68)
at
org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:70)
at
org.apache.camel.processor.DelegateAsyncProcessor.processNext(DelegateAsyncProcessor.java:98)
at
org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:89)
at
org.apache.camel.processor.interceptor.TraceInterceptor.process(TraceInterceptor.java:99)
at
org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:70)
at
org.apache.camel.processor.RedeliveryErrorHandler.processErrorHandler(RedeliveryErrorHandler.java:299)
at
org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:208)
at
org.apache.camel.processor.DefaultChannel.process(DefaultChannel.java:269)
at
org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:70)
at
org.apache.camel.processor.loadbalancer.FailOverLoadBalancer.processExchange(FailOverLoadBalancer.java:226)
at
org.apache.camel.processor.loadbalancer.FailOverLoadBalancer.access$300(FailOverLoadBalancer.java:38)
at
org.apache.camel.processor.loadbalancer.FailOverLoadBalancer$FailOverAsyncCallback.done(FailOverLoadBalancer.java:286)
at
org.apache.camel.processor.DefaultChannel$1.done(DefaultChannel.java:275)
at
org.apache.camel.processor.RedeliveryErrorHandler.deliverToFailureProcessor(RedeliveryErrorHandler.java:639)
at
org.apache.camel.processor.RedeliveryErrorHandler.processAsyncErrorHandler(RedeliveryErrorHandler.java:368)
at
org.apache.camel.processor.RedeliveryErrorHandler$1.done(RedeliveryErrorHandler.java:317)
at
org.apache.camel.management.InstrumentationProcessor$1.done(InstrumentationProcessor.java:78)
at
org.apache.camel.component.cxf.CxfClientCallback.handleException(CxfClientCallback.java:85)
at
org.apache.cxf.interceptor.ClientOutFaultObserver.onMessage(ClientOutFaultObserver.java:59)
at
org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream$1.run(HTTPConduit.java:2203)
at
org.apache.cxf.workqueue.AutomaticWorkQueueImpl$2.run(AutomaticWorkQueueImpl.java:253)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown
Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.IllegalStateException: Already connected
at java.net.HttpURLConnection.setFixedLengthStreamingMode(Unknown
Source)
at
org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.thresholdNotReached(HTTPConduit.java:1937)
at
org.apache.cxf.io.AbstractThresholdOutputStream.close(AbstractThresholdOutputStream.java:99)
at
org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:2029)
... 38 more
{code}
The failover does not work. However when I change the loglevel of
_org.apache.camel.processor.interceptor.Tracer_ from WARN to INFO in my
log4j.properties, the failover does work as expected. In both cases tracing is
enabled.
I believe this is a bug since the behaviour of the failover changes if the log
level is changed.
We were able to reproduce this behaviour on multiple systems. If you have any
problems reproducing this behaviour we are happy to provide more information or
an example project.
--
This message is automatically generated by JIRA.
-
For more information on JIRA, see: http://www.atlassian.com/software/jira