DeadLetterChannelBuilder in combination w/ doTry/doCatch

classic Classic list List threaded Threaded
4 messages Options
Reply | Threaded
Open this post in threaded view
|

DeadLetterChannelBuilder in combination w/ doTry/doCatch

Gerald Kallas - mailbox.org
Hi all,

I've following route. The doCatch should do some specific stuff in case of an error, followed by a general execption thrown for hitting the error handler.

I'd expect that in case of an error the message would be sent to the DLQ but this doesn't happen.

What I'm doing wrong here? Tx for any hints.

Best
- Gerald

<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
        xmlns:ext="http://aries.apache.org/blueprint/xmlns/blueprint-ext/v1.0.0"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 https://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd">

        <bean id="redeliveryPolicyConfig" class="org.apache.camel.processor.errorhandler.RedeliveryPolicy">
                <property name="maximumRedeliveries" value="3"/>
                <property name="redeliveryDelay" value="5000"/>
        </bean>

        <bean id="deadLetterErrorHandler" class="org.apache.camel.builder.DeadLetterChannelBuilder">
                <property name="deadLetterUri" value="jms:queue:DLQ"/>
                <property name="redeliveryPolicy" ref="redeliveryPolicyConfig"/>
        </bean>

        <camelContext>

                <route>
                        <from uri="jms:queue:TEST" errorHandlerRef="deadLetterErrorHandler" />

                        <doTry>

                                <to uri="https://someFailureEndpoint" />

                                <doCatch>

                                        <exception>java.lang.Exception</exception>
                                        ...

                                        <throwException exceptionType="java.lang.Exception" message="Exception captured."/>
                                </doCatch>

                                <doFinally>
                                </doFinally>

                        </doTry>
                </route>

        </camelContext>

</blueprint>
Reply | Threaded
Open this post in threaded view
|

Re: DeadLetterChannelBuilder in combination w/ doTry/doCatch

Claus Ibsen-2
Hi

Dont throw an exception again while handling the exception in doCatch.
But instead you can send the message direct to the DLQ.
And also dont make your error handling to complex.

On Wed, Apr 22, 2020 at 2:37 PM Gerald Kallas <[hidden email]> wrote:

>
> Hi all,
>
> I've following route. The doCatch should do some specific stuff in case of an error, followed by a general execption thrown for hitting the error handler.
>
> I'd expect that in case of an error the message would be sent to the DLQ but this doesn't happen.
>
> What I'm doing wrong here? Tx for any hints.
>
> Best
> - Gerald
>
> <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
>         xmlns:ext="http://aries.apache.org/blueprint/xmlns/blueprint-ext/v1.0.0"
>         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>         xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 https://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd">
>
>         <bean id="redeliveryPolicyConfig" class="org.apache.camel.processor.errorhandler.RedeliveryPolicy">
>                 <property name="maximumRedeliveries" value="3"/>
>                 <property name="redeliveryDelay" value="5000"/>
>         </bean>
>
>         <bean id="deadLetterErrorHandler" class="org.apache.camel.builder.DeadLetterChannelBuilder">
>                 <property name="deadLetterUri" value="jms:queue:DLQ"/>
>                 <property name="redeliveryPolicy" ref="redeliveryPolicyConfig"/>
>         </bean>
>
>         <camelContext>
>
>                 <route>
>                         <from uri="jms:queue:TEST" errorHandlerRef="deadLetterErrorHandler" />
>
>                         <doTry>
>
>                                 <to uri="https://someFailureEndpoint" />
>
>                                 <doCatch>
>
>                                         <exception>java.lang.Exception</exception>
>                                         ...
>
>                                         <throwException exceptionType="java.lang.Exception" message="Exception captured."/>
>                                 </doCatch>
>
>                                 <doFinally>
>                                 </doFinally>
>
>                         </doTry>
>                 </route>
>
>         </camelContext>
>
> </blueprint>



--
Claus Ibsen
-----------------
http://davsclaus.com @davsclaus
Camel in Action 2: https://www.manning.com/ibsen2
Reply | Threaded
Open this post in threaded view
|

Re: DeadLetterChannelBuilder in combination w/ doTry/doCatch

Gerald Kallas - mailbox.org
Hi Claus,

tx for the reply.

I already thought about direct send to the DLQ.

When I'm going to use a file consumer with a failure directory configured eg

<from uri="file:/var/casisp/files/prices?include=.*&amp;moveFailed=error/>

the move would be only executed when an exception has been thrown. Do you have any hint on this with the approach as described?

Best
- Gerald

> Claus Ibsen <[hidden email]> hat am 22. April 2020 14:49 geschrieben:
>
>  
> Hi
>
> Dont throw an exception again while handling the exception in doCatch.
> But instead you can send the message direct to the DLQ.
> And also dont make your error handling to complex.
>
> On Wed, Apr 22, 2020 at 2:37 PM Gerald Kallas <[hidden email]> wrote:
> >
> > Hi all,
> >
> > I've following route. The doCatch should do some specific stuff in case of an error, followed by a general execption thrown for hitting the error handler.
> >
> > I'd expect that in case of an error the message would be sent to the DLQ but this doesn't happen.
> >
> > What I'm doing wrong here? Tx for any hints.
> >
> > Best
> > - Gerald
> >
> > <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
> >         xmlns:ext="http://aries.apache.org/blueprint/xmlns/blueprint-ext/v1.0.0"
> >         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
> >         xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 https://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd">
> >
> >         <bean id="redeliveryPolicyConfig" class="org.apache.camel.processor.errorhandler.RedeliveryPolicy">
> >                 <property name="maximumRedeliveries" value="3"/>
> >                 <property name="redeliveryDelay" value="5000"/>
> >         </bean>
> >
> >         <bean id="deadLetterErrorHandler" class="org.apache.camel.builder.DeadLetterChannelBuilder">
> >                 <property name="deadLetterUri" value="jms:queue:DLQ"/>
> >                 <property name="redeliveryPolicy" ref="redeliveryPolicyConfig"/>
> >         </bean>
> >
> >         <camelContext>
> >
> >                 <route>
> >                         <from uri="jms:queue:TEST" errorHandlerRef="deadLetterErrorHandler" />
> >
> >                         <doTry>
> >
> >                                 <to uri="https://someFailureEndpoint" />
> >
> >                                 <doCatch>
> >
> >                                         <exception>java.lang.Exception</exception>
> >                                         ...
> >
> >                                         <throwException exceptionType="java.lang.Exception" message="Exception captured."/>
> >                                 </doCatch>
> >
> >                                 <doFinally>
> >                                 </doFinally>
> >
> >                         </doTry>
> >                 </route>
> >
> >         </camelContext>
> >
> > </blueprint>
>
>
>
> --
> Claus Ibsen
> -----------------
> http://davsclaus.com @davsclaus
> Camel in Action 2: https://www.manning.com/ibsen2
Reply | Threaded
Open this post in threaded view
|

Re: DeadLetterChannelBuilder in combination w/ doTry/doCatch

Claus Ibsen-2
Hi

Mind about the DLQ is usually a drop point for the message content,
and as you use a file endpoint, then you can only reply this by having
a route that pickup those files and route back to what its supposed to
do. The actual exception message should still be logged in the log, so
you have a chance to find out why it failed.

Also mind that this requires to be able to reply the message safely,
eg the error may happen half way into a route, and then you replay the
message from DLQ, and then it may re-process some parts it did before
the error (idempotence).

Since your example started from a JMS and a JMS broker has error
handling and delivery, then have you though about using its feature
for that, and not Camels.




On Wed, Apr 22, 2020 at 2:59 PM Gerald Kallas <[hidden email]> wrote:

>
> Hi Claus,
>
> tx for the reply.
>
> I already thought about direct send to the DLQ.
>
> When I'm going to use a file consumer with a failure directory configured eg
>
> <from uri="file:/var/casisp/files/prices?include=.*&amp;moveFailed=error/>
>
> the move would be only executed when an exception has been thrown. Do you have any hint on this with the approach as described?
>
> Best
> - Gerald
>
> > Claus Ibsen <[hidden email]> hat am 22. April 2020 14:49 geschrieben:
> >
> >
> > Hi
> >
> > Dont throw an exception again while handling the exception in doCatch.
> > But instead you can send the message direct to the DLQ.
> > And also dont make your error handling to complex.
> >
> > On Wed, Apr 22, 2020 at 2:37 PM Gerald Kallas <[hidden email]> wrote:
> > >
> > > Hi all,
> > >
> > > I've following route. The doCatch should do some specific stuff in case of an error, followed by a general execption thrown for hitting the error handler.
> > >
> > > I'd expect that in case of an error the message would be sent to the DLQ but this doesn't happen.
> > >
> > > What I'm doing wrong here? Tx for any hints.
> > >
> > > Best
> > > - Gerald
> > >
> > > <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
> > >         xmlns:ext="http://aries.apache.org/blueprint/xmlns/blueprint-ext/v1.0.0"
> > >         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
> > >         xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 https://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd">
> > >
> > >         <bean id="redeliveryPolicyConfig" class="org.apache.camel.processor.errorhandler.RedeliveryPolicy">
> > >                 <property name="maximumRedeliveries" value="3"/>
> > >                 <property name="redeliveryDelay" value="5000"/>
> > >         </bean>
> > >
> > >         <bean id="deadLetterErrorHandler" class="org.apache.camel.builder.DeadLetterChannelBuilder">
> > >                 <property name="deadLetterUri" value="jms:queue:DLQ"/>
> > >                 <property name="redeliveryPolicy" ref="redeliveryPolicyConfig"/>
> > >         </bean>
> > >
> > >         <camelContext>
> > >
> > >                 <route>
> > >                         <from uri="jms:queue:TEST" errorHandlerRef="deadLetterErrorHandler" />
> > >
> > >                         <doTry>
> > >
> > >                                 <to uri="https://someFailureEndpoint" />
> > >
> > >                                 <doCatch>
> > >
> > >                                         <exception>java.lang.Exception</exception>
> > >                                         ...
> > >
> > >                                         <throwException exceptionType="java.lang.Exception" message="Exception captured."/>
> > >                                 </doCatch>
> > >
> > >                                 <doFinally>
> > >                                 </doFinally>
> > >
> > >                         </doTry>
> > >                 </route>
> > >
> > >         </camelContext>
> > >
> > > </blueprint>
> >
> >
> >
> > --
> > Claus Ibsen
> > -----------------
> > http://davsclaus.com @davsclaus
> > Camel in Action 2: https://www.manning.com/ibsen2



--
Claus Ibsen
-----------------
http://davsclaus.com @davsclaus
Camel in Action 2: https://www.manning.com/ibsen2