You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@camel.apache.org by "Claus Ibsen (JIRA)" <ji...@apache.org> on 2014/12/03 21:11:15 UTC

[jira] [Updated] (CAMEL-7705) DynamicRouter hangs thread after bean binding failure

     [ https://issues.apache.org/jira/browse/CAMEL-7705?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Claus Ibsen updated CAMEL-7705:
-------------------------------
    Fix Version/s: 2.15.0
                   2.14.2
                   2.13.4

> DynamicRouter hangs thread after bean binding failure
> -----------------------------------------------------
>
>                 Key: CAMEL-7705
>                 URL: https://issues.apache.org/jira/browse/CAMEL-7705
>             Project: Camel
>          Issue Type: Bug
>          Components: camel-core
>    Affects Versions: 2.13.2
>            Reporter: Niels Bertram
>             Fix For: 2.13.4, 2.14.2, 2.15.0
>
>         Attachments: camel-dynamic-router-zombie.zip
>
>
> I have come across a rather complex problem that results in servicemix going into a limbo state not allowing me to deinstall or reinstall the camel context that causes the issue. I replicated the issue in a camel blueprint test with a very scaled down version of the actual implementation - just enough to show how and why it fails (see attached zip of the maven project).
> Here is how it works (or better does not work):
> The example contains a route called {{SessionResourceRoute}} that simply accepts a message payload and hands it over to a bean called {{DynamicSourceRouter}} which has a route method annotated with {{@DynamicRouter}}.
> The routing slip method looks something like that (full detail in code attached):
> {code:java}
> @DynamicRouter
> public String route(
>   @Header(Exchange.SLIP_ENDPOINT) String previous,
>   @Header(SOURCE_ADAPTER) String sourceAdapter,
>   @XPath(value = "/child::node()/local-name()") String messageType,
>   @XPath(value = "/child::node()/@version") String messageVersion,
>   Exchange exchange) {
>   ...
> {code}
> The "logic" within the dynamic router will resolve to send the payload onto another route defined in {{OneSessionResourceRoute}}. This route will send the request message to a CXF endpoint that is configured to return a soap fault.
> When the cxf route fails, the dynamic route method on the {{DynamicSourceRouter}} is called again to work out if there are others that need to be called. Unfortunately when the route returns from the CXF the message is the CXFPayload containing the soap fault and when camel tries to extract the XPath values out of the failed exchange, itself will fall over and then the thread just hangs.
> I understand that this is fixable but I simply like to point out that the dynamic router will make the context thread hang and in my case turns servicemix into a wobble. It also is not very intuitive for someone not as well versed with camel as to what actually is happening.
> To replicate the issue, simply run the maven project as
> {{mvn clean test}}
> OR manually 
> - import {{\[project.basedir\]/src/test/resources/SessionResourceMock-soapui-project.xml}} into SoapUI and start the mock
> - use your favourite IBE to run unit test {{SessionResourceManagerFailureTest}}
> You will see that the test has to be stopped with CTRL+C or Z or you'll have to kill the test process in the IDE ...



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)