camel-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Claus Ibsen <claus.ib...@gmail.com>
Subject Re: modify message before delivering to Dead Letter Queue
Date Mon, 19 Oct 2009 13:05:17 GMT
On Tue, Oct 13, 2009 at 10:36 PM, terminator_007
<ankita_sonal@intuit.com> wrote:
>
> hey,
> thanks for the suggestion but I coudnt understand it...
>
> can you please elaborate a little...
>

Ah found your reply.

In your route you have several endpoints that you send a message to.
And in any case of an error you let the dead letter channel handle
this error.
Your problem is then you want to know if it was endpoint A, endpoint B
or endpoint ... N that failed?

What we could do is to let Camel decorate the message with a
header/property that tells which endpoint was last invoked.
Then it makes it super easy for you to know which endpoints failed.

Does it make sense now?


> thanks a ton.
>
>
> Claus Ibsen-2 wrote:
>>
>> Hi
>>
>> Maybe we should let Camel add the endpoint a producer is sending to.
>>
>> Then when you route using .to("xxx") then Camel will add a header such as
>> Exchange.SENDTO_ENDPOINT
>>
>> Which contains the XXX
>>
>> That would allow you to easily know which service failed.
>>
>>
>>
>>
>> On Sun, Oct 11, 2009 at 1:39 AM, tide08 <sachin2_2k@yahoo.com> wrote:
>>>
>>> I would assume that uri would be available in header as per Camel-Http
>>> Documentation:
>>>
>>> HttpProducer.HTTP_URI - for v1.6.x
>>> Exchange.HTTP_URI - for v2.x
>>>
>>> or else as other approach you can just set header to distinguish between
>>> uri's avoiding custom processor for errorHandler itself.
>>>
>>> Something like -
>>>
>>> <to uri="bean:soapMessageCreator"/>
>>>                        <multicast>
>>> <pipeline>
>>> <setHeader headerName="serviceName">
>>>        <constant>serviceone</constant>
>>>    </setHeader>
>>>
>>>                        <to
>>> uri="http://mpkl04l34h9g2:8080/serviceone/subscriber"/>
>>> </pipeline>
>>> <pipeline>
>>> <setHeader headerName="serviceName">
>>>        <constant>servicetwo</constant>
>>>    </setHeader>
>>>
>>>                        <to
>>> uri="http://mpkl04l34h9g2:8080/servicetwo/subscriber"/>
>>> </pipeline>
>>>                        </multicast>
>>>
>>> All the best!
>>>
>>>
>>>
>>>
>>> terminator_007 wrote:
>>>>
>>>> thanks for the suggestion..i have one doubt here..how do i get the know
>>>> in
>>>> the processor class which delivery has failed...i am delivering to two
>>>> destinations...so is there any property on the xchange message which
>>>> will
>>>> tell me the delivery to which destination has failed ?
>>>>
>>>> tide08 wrote:
>>>>>
>>>>> You can register a processor which is invoked before message to DLQ.
>>>>> This
>>>>> can be achieved by property onRedelivery on DeadLetterChannelBuilder.
>>>>> So
>>>>> following should work -
>>>>>
>>>>> <bean id="myDeadLetterErrorHandler"
>>>>> class="org.apache.camel.builder.DeadLetterChannelBuilder">
>>>>>            <property name="onRedelivery" ref="myErrorProcessor"/>
>>>>>            <property name="deadLetterUri"
>>>>> value="activemq:queue:queue.DeadLetter"/>
>>>>>             <property name="redeliveryPolicy"
>>>>> ref="myRedeliveryPolicyConfig"/>
>>>>>                 <property name="useOriginalMessage" value="true"/>
>>>>>
>>>>>              <property name="handled" value="false"/>
>>>>>       </bean>
>>>>>
>>>>> <bean id="myErrorProcessor" class="com.app.CustomErrorProcessor" />
>>>>>
>>>>> You can than manipulate message header before it goes to DLQ.
>>>>>
>>>>> Thanks!
>>>>>
>>>>>
>>>>> terminator_007 wrote:
>>>>>>
>>>>>> This is my configuration file
>>>>>>
>>>>>>     <bean id="soapMessageCreator" class="XXX.SOAPMessageCreator"/>
>>>>>>
>>>>>>      <bean id="myDeadLetterErrorHandler"
>>>>>> class="org.apache.camel.builder.DeadLetterChannelBuilder">
>>>>>>            <property name="deadLetterUri"
>>>>>> value="activemq:queue:queue.DeadLetter"/>
>>>>>>            <property name="redeliveryPolicy"
>>>>>> ref="myRedeliveryPolicyConfig"/>
>>>>>>                <property name="useOriginalMessage" value="true"/>
>>>>>>
>>>>>>             <property name="handled" value="false"/>
>>>>>>      </bean>
>>>>>>      <bean id="myRedeliveryPolicyConfig"
>>>>>> class="org.apache.camel.processor.RedeliveryPolicy">
>>>>>>            <property name="maximumRedeliveries" value="4"/>
>>>>>>            <property name="redeliverDelay" value="250"/>
>>>>>>      </bean>
>>>>>>
>>>>>>    <camelContext id="camel"
>>>>>> xmlns="http://camel.apache.org/schema/spring" >
>>>>>>         <package>org.apache.camel.example.jmstofile</package>
>>>>>>          <route errorHandlerRef="myDeadLetterErrorHandler">
>>>>>>                     <from
>>>>>> uri="activemq:topic:topic.Patient?clientId=testCamelClient&durableSubscriptionName=zyz123"/>
>>>>>>             <to uri="bean:soapMessageCreator"/>
>>>>>>                     <multicast>
>>>>>>                     <to
>>>>>> uri="http://mpkl04l34h9g2:8080/serviceone/subscriber"/>
>>>>>>                     <to
>>>>>> uri="http://mpkl04l34h9g2:8080/servicetwo/subscriber"/>
>>>>>>                     </multicast>
>>>>>>
>>>>>>         </route>
>>>>>>    </camelContext>
>>>>>>
>>>>>> <bean id="http" class="org.apache.camel.component.http.HttpComponent">
>>>>>>     <property name="camelContext" ref="camel"/>
>>>>>>     <property name="httpConnectionManager"
>>>>>> ref="myHttpConnectionManager"/>
>>>>>> </bean>
>>>>>>
>>>>>> <bean id="myHttpConnectionManager"
>>>>>> class="org.apache.commons.httpclient.MultiThreadedHttpConnectionManager">
>>>>>>     <property name="params" ref="myHttpConnectionManagerParams"/>
>>>>>> </bean>
>>>>>>
>>>>>> <bean id="myHttpConnectionManagerParams"
>>>>>> class="org.apache.commons.httpclient.params.HttpConnectionManagerParams">
>>>>>>     <property name="defaultMaxConnectionsPerHost" value="5"/>
>>>>>> </bean>
>>>>>>
>>>>>>
>>>>>> here, if one of my "to" destination is down, I see two messages in
the
>>>>>> DLQ.
>>>>>> also, i want to modify the message header with the name of the
>>>>>> destination that failed for example if service
>>>>>> "http://mpkl04l34h9g2:8080/servicetwo/subscriber" was down, I want
 to
>>>>>> add "http://mpkl04l34h9g2:8080/servicetwo/subscriber" to
>>>>>> messager/header/target before delivering the message to DLQ so that
>>>>>> the
>>>>>> admin process which checks messages in DLQ knows which are the targets
>>>>>> which did not receive the message.
>>>>>>
>>>>>> Please suggest what can be done to achieve this.
>>>>>>
>>>>>
>>>>>
>>>>
>>>>
>>>
>>> --
>>> View this message in context:
>>> http://www.nabble.com/modify-message-before-delivering-to-Dead-Letter-Queue-tp25827098p25838615.html
>>> Sent from the Camel - Users mailing list archive at Nabble.com.
>>>
>>>
>>
>>
>>
>> --
>> Claus Ibsen
>> Apache Camel Committer
>>
>> Open Source Integration: http://fusesource.com
>> Blog: http://davsclaus.blogspot.com/
>> Twitter: http://twitter.com/davsclaus
>>
>>
>
> --
> View this message in context: http://www.nabble.com/modify-message-before-delivering-to-Dead-Letter-Queue-tp25827098p25880385.html
> Sent from the Camel - Users mailing list archive at Nabble.com.
>
>



-- 
Claus Ibsen
Apache Camel Committer

Open Source Integration: http://fusesource.com
Blog: http://davsclaus.blogspot.com/
Twitter: http://twitter.com/davsclaus

Mime
View raw message