You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@camel.apache.org by "Dan Rivett (JIRA)" <ji...@apache.org> on 2017/03/09 07:15:38 UTC

[jira] [Commented] (CAMEL-10972) ProducerCache uses Endpoint.getEndpointUri() as key which isn't always unique!

    [ https://issues.apache.org/jira/browse/CAMEL-10972?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15902596#comment-15902596 ] 

Dan Rivett commented on CAMEL-10972:
------------------------------------

[~cibsen@e-ma.net] thanks for triaging. Can I ask you to confirm that the Context Component (http://camel.apache.org/context.html) is deprecated as I don't see any mention of that on the page linked so I wanted to confirm.

If not deprecated then I'm pretty sure this issue is still present in the latest version. In that case, if the use case shown above is valid, would this be a candidate for being reopened if demonstrated on 2.18.2?

Thanks.

> ProducerCache uses Endpoint.getEndpointUri() as key which isn't always unique!
> ------------------------------------------------------------------------------
>
>                 Key: CAMEL-10972
>                 URL: https://issues.apache.org/jira/browse/CAMEL-10972
>             Project: Camel
>          Issue Type: Bug
>    Affects Versions: 2.16.1
>            Reporter: Dan Rivett
>            Assignee: Claus Ibsen
>
> Found in 2.16.1 (I can't upgrade yet due to it being run in a legacy Spring 3.2 environment) but it looks to still be present in the current codebase from viewing the master branch.
> h3. Background
> When referencing direct endpoints from a different context using the uri {{context:endpointUri}} such as the following:
> {code}
> <route id="deadLetterRouteWithMulticast">
> 	<from uri="direct:foo"/>
> 	<multicast>
> 		<to uri="context-a:notifyProcessingFailedRoute" />
> 		<to uri="context-b:notifyProcessingFailedRoute" />
> 	</multicast>
> </route>
> {code}
> This works fine.
> However swap to a {{RecipientList}} and it fails:
> {code}
> <route id="deadLetterRouteWithRecipientList">
> 	<from uri="direct:foo"/>
> 	<setHeader headerName="myRecipientListHeader">
> 		<constant>context-a:notifyProcessingFailedRoute,context-b:notifyProcessingFailedRoute</constant>
> 	</setHeader>
> 	<recipientList delimiter=",">
> 		<header>myRecipientListHeader</header>
> 	</recipientList>
> </route>
> {code}
> h3. Investigation
> This appears to be due to {{ProducerCache}} caching by {{Endpoint.getEndpointUri()}} which in the case of a {{DirectEndpoint}} both the recipients in the list return the same ({{direct://notifyProcessingFailedRoute}} value in the example above). {{ProducerCache}} is called by {{RecipientListProcessor}} [here|https://github.com/apache/camel/blob/master/camel-core/src/main/java/org/apache/camel/processor/RecipientListProcessor.java#L202]. Note: the {{endpoint}} variable two lines above resolves to the correct {{Endpoint}} it is the {{Producer}} which is resolved (via cache) incorrectly.
> Now I don't know the Camel codebase well enough to say if {{DirectEndpoint.getEndpointUri()}} should return ambiguous URIs in multi-Camel-Context environments, or whether {{ProducerCache.doGetProducer()}} (see [here|https://github.com/apache/camel/blob/master/camel-core/src/main/java/org/apache/camel/impl/ProducerCache.java#L564]) should use a key like something as follows to use a cache key that takes into account the {{Endpoint}}'s Camel Context:
> {code}
> String key = endpoint.getCamelContext().getName() + "_" + endpoint.getEndpointUri();
> {code}
> This seems over-simplistic because endpoints that aren't Camel Context specific such as JMS could be in the cache multiple times, but at least the correct {{Endpoint}} would be returned from the cache each time, unlike now.
> h3. Workarounds
> 1. Use different endpoint uris (e.g. prepend context name).
> 2. Supply the Recipient List with Endpoints rather than Strings to avoid parsing the URIs into Endpoints and running into this issue (see [this line|https://github.com/apache/camel/blob/master/camel-core/src/main/java/org/apache/camel/util/ExchangeHelper.java#L87]). Seems a bit of a hack.



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)