camel-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Willem Jiang <willem.ji...@gmail.com>
Subject Re: recipientList inside SEDA route with CXF
Date Fri, 30 Sep 2011 08:33:10 GMT
Hi,

You can set the request context on the message to workaround this issue.
Here is an example from camel-cxf unit test[1] that you can take a look.

[1]https://svn.apache.org/repos/asf/camel/trunk/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/CxfProducerContextTest.java

On 9/29/11 10:16 PM, Achim Nierbeck wrote:
> I did take a look at the sources and I think I found the
> root of my problem, though I'm not sure how to get around it:
>
> RecipientList class contains a producer cache,
> in this cache the RecipientListProcessor class does store the
> endpoints depending on the uri as key.
> Now since only my header changes I don't know how to get around this.
> Any ideas?
>
> Thanks in advance, Achim
>
> 2011/9/29 Achim Nierbeck<bcanhome@googlemail.com>:
>> Ok,
>>
>> some more worrying details.
>>
>> Right now I have two Remote Hosts
>> After a successful run on Host A a second run is done (not parallel
>> but sequential) on Host B.
>> And I'm able to see that the header.address is set to host B still I
>> see that the request is made on Host A.
>>
>> Is this intentional, are there any ways of not "remembering" which
>> call did go to which Host?
>>
>> Thanks again, Achim
>>
>> 2011/9/29 Achim Nierbeck<bcanhome@googlemail.com>:
>>> Hi
>>>
>>> using Camel 2.8.0 I'm having the following scenario.
>>> I'm using the CXF for connecting to a couple .NET Webservices.
>>>
>>>         <!-- CXF config -->
>>>         <cxf:cxfEndpoint id="productionServer"
>>>                 serviceClass="net.testservices.productionservice._2011_07.IService"
>>>                 endpointName="s:basicHttpProductionService" serviceName="s:ProductionService"
>>>                 wsdlURL="classpath:/wsdl/_1.wsdl" xmlns:s="http://tempuri.org/"
>>>                 xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays"
>>>                 xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
>>>                 <cxf:properties>
>>>                         <entry key="dataFormat" value="POJO" />
>>>                 </cxf:properties>
>>>                 <cxf:outInterceptors>
>>>                         <ref bean="loggingOutInterceptor" />
>>>                 </cxf:outInterceptors>
>>>         </cxf:cxfEndpoint>
>>>
>>>
>>> Now I have a route for looking up some data in the DB for example also
>>> looking for a free
>>> WebService to call:
>>>
>>>                 <camel:route id="pollQueue">
>>>                         <camel:from uri="timer://pollQueueTimer?fixedRate=true&amp;period=30000"
/>
>>>
>>> ... do preparation ....
>>> ... also set the address of the remote host into the header of the exchange ...
>>> ... call the "production" route ...
>>>
>>>                                         <camel:to uri="seda:production" />
>>>                 </camel:route>
>>>
>>> the production route does call the Webservice on the available remote
>>> host as follows
>>>
>>> ... again a couple of preparations beforehand ....
>>>
>>>                         <!-- Altering Body to contain no data -->
>>>                         <camel:setBody>
>>>                                 <camel:mvel>[ ]</camel:mvel>
>>>                         </camel:setBody>
>>>
>>>                         <!-- service call -->
>>>                         <camel:setHeader headerName="operationName">
>>>                                 <camel:constant>ProduceData</camel:constant>
>>>                         </camel:setHeader>
>>>
>>> ... the address of the remote webservice was previously added to the
>>> header in the starting route ...
>>>
>>>
>>> ... I needed to set the parallelProcessing to true, if not everything
>>> fails because the Timer Route tries to start another recipientList ...
>>>
>>>                         <camel:recipientList parallelProcessing="true">
>>>                                 <camel:simple>cxf:bean:productionServer?address=${header.address}</camel:simple>
>>>                         </camel:recipientList>
>>>
>>> ... some more calls checking data, errorhandling  and so forth ....
>>>
>>>
>>> Now the following happened to me when I had more than one Remote Host
>>> available:
>>>
>>> Calls to Host A did run on Host B
>>> Results expecting to be retrieved from Host A where polled from Host B.
>>> Now I wonder if the calls to certain Methods are cached or if the
>>> "re-running" timmer route does
>>> interfere somehow with the already running route.
>>>
>>> A Complete run of a route can take up to about 30 Minutes after that
>>> the "Production"-Route is done.
>>> Since there are multiple hosts available we want to do parallel processing.
>>>
>>> Any hints are welcome,
>>>
>>> Achim
>>>
>>>
>>> --
>>> --
>>> *Achim Nierbeck*
>>>
>>>
>>> Apache Karaf<http://karaf.apache.org/>  Committer&  PMC
>>> OPS4J Pax Web<http://wiki.ops4j.org/display/paxweb/Pax+Web/>
>>> Committer&  Project Lead
>>> blog<http://notizblog.nierbeck.de/>
>>>
>>
>>
>>
>> --
>> --
>> *Achim Nierbeck*
>>
>>
>> Apache Karaf<http://karaf.apache.org/>  Committer&  PMC
>> OPS4J Pax Web<http://wiki.ops4j.org/display/paxweb/Pax+Web/>
>> Committer&  Project Lead
>> blog<http://notizblog.nierbeck.de/>
>>
>
>
>


-- 
Willem
----------------------------------
FuseSource
Web: http://www.fusesource.com
Blog:    http://willemjiang.blogspot.com (English)
          http://jnn.javaeye.com (Chinese)
Twitter: willemjiang
Weibo: willemjiang

Mime
View raw message