Hi everyone, we are using Camel CXF and found the following problem: It can happen that a route is trying to start for an infinite amount of time due to missing response from WSDL endpoint.
Setup: A CXF endpoint that is using an external WSDL (i.e. wsdlURL=http://someHost/test/wsdl) The WSDL endpoint is not responding A conduit configured with 100ms timeouts (connections- and read-timeout) Test: I attached a sample app to this mail. To start the application, start DemoApplication.java. It will start a camel route containing a CXF endpoint. The CXF endpoint in the route tries to read an external WSDL. The endpoint for this WSDL is doing a 15 minute sleep before responding to simulate a "no response from WSDL endpoint" (implemented in RouteController). The conduit is configured with 100ms timeouts for connection- and readtimeout The application will fail to start if the route cannot be started. Since the WSDL can't be fetched within the 100ms timeout, I would expect the app-startup to fail at least within 1 minute. However the startup seems to go on for an infinite amount of time. I did some debugging and found several requests are done for the WSDL with different timeouts (in this order): 1. org.apache.cxf.transport.http.URLConnectionHTTPConduit:134 * connectionTimeout 100 ms * readTimeout 100 ms * timeout-values are taken from conduit 1. org.apache.cxf.resource.URIResolver:282 * connectionTimeout 30 seconds * readTimeout 60 seconds * hardcoded values 1. org.springframework.core.io.AbstractFileResolvingResource:60 * connectionTimeout 0 //infinite waiting * readTimeout 0 //infinite waiting * no explicit timeouts are set Our main problem here is the last request that has no timeout configured at all. I attached the stacktrace of the blocked thread. I would expect that the timeouts from the conduit are applied. This seems not to be the case so I think this is a bug. What do you think? Thanks in advance Best regards, Manuel
<<attachment: test.zip>>
"main@1" prio=5 tid=0x1 nid=NA runnable java.lang.Thread.State: RUNNABLE at java.net.SocketInputStream.socketRead0(SocketInputStream.java:-1) at java.net.SocketInputStream.socketRead(SocketInputStream.java:115) at java.net.SocketInputStream.read(SocketInputStream.java:168) at java.net.SocketInputStream.read(SocketInputStream.java:140) at java.io.BufferedInputStream.fill(BufferedInputStream.java:252) at java.io.BufferedInputStream.read1(BufferedInputStream.java:292) at java.io.BufferedInputStream.read(BufferedInputStream.java:351) - locked <0x20fe> (a java.io.BufferedInputStream) at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:754) at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:689) at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1615) - locked <0x20ff> (a sun.net.www.protocol.http.HttpURLConnection) at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1520) at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:527) at org.springframework.core.io.AbstractFileResolvingResource.exists(AbstractFileResolvingResource.java:60) at org.apache.cxf.bus.spring.BusApplicationContextResourceResolver.getAsStream(BusApplicationContextResourceResolver.java:47) at org.apache.cxf.resource.DefaultResourceManager.findResource(DefaultResourceManager.java:115) at org.apache.cxf.resource.DefaultResourceManager.getResourceAsStream(DefaultResourceManager.java:67) at org.apache.cxf.wsdl11.ResourceManagerWSDLLocator.getInputSource(ResourceManagerWSDLLocator.java:55) at org.apache.cxf.wsdl11.ResourceManagerWSDLLocator.getInputSource(ResourceManagerWSDLLocator.java:49) at org.apache.cxf.wsdl11.AbstractWrapperWSDLLocator.getBaseInputSource(AbstractWrapperWSDLLocator.java:73) at org.apache.cxf.wsdl11.WSDLManagerImpl.loadDefinition(WSDLManagerImpl.java:225) at org.apache.cxf.wsdl11.WSDLManagerImpl.getDefinition(WSDLManagerImpl.java:165) at org.apache.camel.component.cxf.CxfEndpoint.getServiceNameAsQName(CxfEndpoint.java:800) at org.apache.camel.component.cxf.CxfEndpoint.setupServerFactoryBean(CxfEndpoint.java:301) at org.apache.camel.component.cxf.CxfSpringEndpoint.createServerFactoryBean(CxfSpringEndpoint.java:148) at org.apache.camel.component.cxf.CxfConsumer.createServer(CxfConsumer.java:72) at org.apache.camel.component.cxf.CxfConsumer.doStart(CxfConsumer.java:106) at org.apache.camel.support.service.BaseService.start(BaseService.java:115) - locked <0x2100> (a java.lang.Object) at org.apache.camel.support.service.ServiceHelper.startService(ServiceHelper.java:113) at org.apache.camel.impl.engine.AbstractCamelContext.startService(AbstractCamelContext.java:3474) at org.apache.camel.impl.engine.InternalRouteStartupManager.doStartOrResumeRouteConsumers(InternalRouteStartupManager.java:401) at org.apache.camel.impl.engine.InternalRouteStartupManager.doStartRouteConsumers(InternalRouteStartupManager.java:319) at org.apache.camel.impl.engine.InternalRouteStartupManager.safelyStartRouteServices(InternalRouteStartupManager.java:213) - locked <0x2101> (a org.apache.camel.impl.engine.InternalRouteStartupManager) at org.apache.camel.impl.engine.InternalRouteStartupManager.doStartOrResumeRoutes(InternalRouteStartupManager.java:147) at org.apache.camel.impl.engine.AbstractCamelContext.doStartCamel(AbstractCamelContext.java:3177) at org.apache.camel.impl.engine.AbstractCamelContext.doStartContext(AbstractCamelContext.java:2861) at org.apache.camel.impl.engine.AbstractCamelContext.doStart(AbstractCamelContext.java:2812) at org.apache.camel.support.service.BaseService.start(BaseService.java:115) - locked <0x2102> (a java.lang.Object) at org.apache.camel.impl.engine.AbstractCamelContext.start(AbstractCamelContext.java:2507) at org.apache.camel.impl.DefaultCamelContext.start(DefaultCamelContext.java:174) at org.apache.camel.spring.SpringCamelContext.start(SpringCamelContext.java:107) at org.apache.camel.spring.xml.CamelContextFactoryBean.start(CamelContextFactoryBean.java:413) at org.apache.camel.spring.xml.CamelContextFactoryBean.onApplicationEvent(CamelContextFactoryBean.java:468) at org.apache.camel.spring.xml.CamelContextFactoryBean.onApplicationEvent(CamelContextFactoryBean.java:97) at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:176) at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:169) at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:143) at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:421) at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:378) at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:938) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:586) - locked <0x2103> (a java.lang.Object) at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:144) at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:782) at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:774) at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:439) at org.springframework.boot.SpringApplication.run(SpringApplication.java:339) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1340) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1329) at de.mash.demo.DemoApplication.main(DemoApplication.java:12)