You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@servicemix.apache.org by Javier Arias <xa...@yahoo.com> on 2010/07/08 12:54:22 UTC
Camel dealetter + Bean strange behaviour
Hello All,
Our general error policy for some parts of our processes is to use a camel
deadletter queue (on file).
What I am trying to do is (sm 3.3.1)
FILE POLLER => CAMEL DEADLETTER => BEAN
In case of error CAMEL would send to a file sender.
So, in an SA we have a bean that make some actions and return DONE or ERROR
depending on the result, what I would expect is that if the bean returns ERROR
camel retries for a number of times and sends to the deadletter, but this is not
done. It is not retrying or sending to deadletter, and my msg disappears (msg
comes from a file poller).
>From other part of the process we are sending an email, which works perfectly
with camel deadletter, retrying and sending to deadletter when necessary.
Probably I am doing wrong but I do not know what.
Below is an example (also, I attached my sample SA):
Thank you in advance.
Javier
====================================================================
BEAN :::
====================================================================
package playground.bean;
import javax.annotation.Resource;
import javax.jbi.messaging.DeliveryChannel;
import javax.jbi.messaging.ExchangeStatus;
import javax.jbi.messaging.MessageExchange;
import javax.jbi.messaging.MessagingException;
import org.apache.servicemix.jbi.listener.MessageExchangeListener;
public class AlwaysErrorBean implements MessageExchangeListener {
@Resource
private DeliveryChannel channel;
@Override
public void onMessageExchange(MessageExchange exchange) throws
MessagingException {
if (exchange.getStatus() != ExchangeStatus.ACTIVE) {
System.out.println("onMessageExchange : RECEIVED NON ACTIVE EXCHANGE
: " + exchange.getStatus().toString());
return;
}
System.out.println(" received message. returning error.");
exchange.setStatus(ExchangeStatus.ERROR);
channel.send(exchange);
}
}
====================================================================
CAMEL ROUTE :::
====================================================================
package playground.camel;
import org.apache.camel.Exchange;
import org.apache.camel.Processor;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.model.InterceptorType;
import org.apache.camel.processor.DelegateProcessor;
public class CamelRouteBuilder extends RouteBuilder {
private final static String JBI_ENDP = "jbi:endpoint:";
private final static String NAMESPACE = "http://playground";
public void configure() throws Exception {
DelegateProcessor proc = new DelegateProcessor(){
public void process(Exchange exchange) throws Exception {
System.out.println(exchange.toString());
processNext(exchange);
}
protected void processNext(Exchange exchange) throws
Exception {
if (processor != null) {
processor.process(exchange);
}
}
};
// ALTERNATIVE 1 : SEND TO ALWAYSERROR BEAN
from(JBI_ENDP+NAMESPACE+"/camelDeadLetter/camelDeadLetterEp")
.errorHandler(deadLetterChannel(JBI_ENDP+NAMESPACE+"/deadLetter/deadLetterEp"))
.to(JBI_ENDP+NAMESPACE+"/alwaysErrorBean/alwaysErrorBeanEp").addInterceptor(proc);
// ALTERNATIVE 2 : SEND TO MAIL COMPONENT
// from(JBI_ENDP+NAMESPACE+"/camelDeadLetter/camelDeadLetterEp")
//
.errorHandler(deadLetterChannel(JBI_ENDP+NAMESPACE+"/deadLetter/deadLetterEp"))
//
.to(JBI_ENDP+NAMESPACE+"/emailSender/emailSenderEp").addInterceptor(proc);
}
}
Re: Camel dealetter + Bean strange behaviour
Posted by Claus Ibsen <cl...@gmail.com>.
On Fri, Jul 9, 2010 at 2:35 PM, Javier Arias <xa...@yahoo.com> wrote:
> Hello Everybody,
>
> I found that if I change in my bean:
> from:
> System.out.println(" received message. returning error.");
> exchange.setStatus(ExchangeStatus.ERROR);
> channel.send(exchange);
>
> to:
> System.out.println(" received message. returning error.");
> throw new MessagingException(" ALWAYS RETURN ERROR. throw messaging
> exception.");
>
> camel is catching the error correctly and making redeliveries and sending to
> deadletter endpoint.
>
> I searched on the documentation and google, but didn't find the response; my
> question is: what is the difference between returning an error exchange and
> throw an exception? which is the recommended way of handling errors in bean? and
> what about patterns on error handling on servicemix?
>
You need to enable handleFault on the Camel side before the Camel
error handler can catch and handle JBI FAULTs
There are a bit of info in chapter 13 of the Camel book. And maybe a
little bit on the camel wiki pages.
> Thank you very much.
>
> Regards.
> Javier.
>
>
>
>
> ________________________________
> From: Javier Arias <xa...@yahoo.com>
> To: users@servicemix.apache.org
> Sent: Thu, July 8, 2010 12:54:22 PM
> Subject: Camel dealetter + Bean strange behaviour
>
>
> Hello All,
>
> Our general error policy for some parts of our processes is to use a camel
> deadletter queue (on file).
>
>
> What I am trying to do is (sm 3.3.1)
>
> FILE POLLER => CAMEL DEADLETTER => BEAN
>
> In case of error CAMEL would send to a file sender.
>
> So, in an SA we have a bean that make some actions and return DONE or ERROR
> depending on the result, what I would expect is that if the bean returns ERROR
> camel retries for a number of times and sends to the deadletter, but this is not
> done. It is not retrying or sending to deadletter, and my msg disappears (msg
> comes from a file poller).
> From other part of the process we are sending an email, which works perfectly
> with camel deadletter, retrying and sending to deadletter when necessary.
>
> Probably I am doing wrong but I do not know what.
>
> Below is an example (also, I attached my sample SA):
>
> Thank you in advance.
> Javier
>
> ====================================================================
> BEAN :::
> ====================================================================
> package playground.bean;
>
> import javax.annotation.Resource;
> import javax.jbi.messaging.DeliveryChannel;
> import javax.jbi.messaging.ExchangeStatus;
> import javax.jbi.messaging.MessageExchange;
> import javax.jbi.messaging.MessagingException;
>
> import org.apache.servicemix.jbi.listener.MessageExchangeListener;
>
> public class AlwaysErrorBean implements MessageExchangeListener {
>
> @Resource
> private DeliveryChannel channel;
>
> @Override
> public void onMessageExchange(MessageExchange exchange) throws
> MessagingException {
> if (exchange.getStatus() != ExchangeStatus.ACTIVE) {
> System.out.println("onMessageExchange : RECEIVED NON ACTIVE EXCHANGE
> : " + exchange.getStatus().toString());
> return;
> }
>
> System.out.println(" received message. returning error.");
> exchange.setStatus(ExchangeStatus.ERROR);
> channel.send(exchange);
> }
> }
>
> ====================================================================
> CAMEL ROUTE :::
> ====================================================================
>
> package playground.camel;
> import org.apache.camel.Exchange;
> import org.apache.camel.Processor;
> import org.apache.camel.builder.RouteBuilder;
> import org.apache.camel.model.InterceptorType;
> import org.apache.camel.processor.DelegateProcessor;
>
> public class CamelRouteBuilder extends RouteBuilder {
>
> private final static String JBI_ENDP = "jbi:endpoint:";
> private final static String NAMESPACE = "http://playground";
>
> public void configure() throws Exception {
>
> DelegateProcessor proc = new DelegateProcessor(){
> public void process(Exchange exchange) throws Exception {
> System.out.println(exchange.toString());
> processNext(exchange);
> }
>
> protected void processNext(Exchange exchange) throws
> Exception {
> if (processor != null) {
> processor.process(exchange);
> }
> }
> };
> // ALTERNATIVE 1 : SEND TO ALWAYSERROR BEAN
> from(JBI_ENDP+NAMESPACE+"/camelDeadLetter/camelDeadLetterEp")
>
> .errorHandler(deadLetterChannel(JBI_ENDP+NAMESPACE+"/deadLetter/deadLetterEp"))
>
>
>
> .to(JBI_ENDP+NAMESPACE+"/alwaysErrorBean/alwaysErrorBeanEp").addInterceptor(proc);
>
> // ALTERNATIVE 2 : SEND TO MAIL COMPONENT
> // from(JBI_ENDP+NAMESPACE+"/camelDeadLetter/camelDeadLetterEp")
> //
> .errorHandler(deadLetterChannel(JBI_ENDP+NAMESPACE+"/deadLetter/deadLetterEp"))
>
>
> //
> .to(JBI_ENDP+NAMESPACE+"/emailSender/emailSenderEp").addInterceptor(proc);
>
> }
> }
>
>
>
--
Claus Ibsen
Apache Camel Committer
Author of Camel in Action: http://www.manning.com/ibsen/
Open Source Integration: http://fusesource.com
Blog: http://davsclaus.blogspot.com/
Twitter: http://twitter.com/davsclaus
Re: Camel dealetter + Bean strange behaviour
Posted by Javier Arias <xa...@yahoo.com>.
Hello Everybody,
I found that if I change in my bean:
from:
System.out.println(" received message. returning error.");
exchange.setStatus(ExchangeStatus.ERROR);
channel.send(exchange);
to:
System.out.println(" received message. returning error.");
throw new MessagingException(" ALWAYS RETURN ERROR. throw messaging
exception.");
camel is catching the error correctly and making redeliveries and sending to
deadletter endpoint.
I searched on the documentation and google, but didn't find the response; my
question is: what is the difference between returning an error exchange and
throw an exception? which is the recommended way of handling errors in bean? and
what about patterns on error handling on servicemix?
Thank you very much.
Regards.
Javier.
________________________________
From: Javier Arias <xa...@yahoo.com>
To: users@servicemix.apache.org
Sent: Thu, July 8, 2010 12:54:22 PM
Subject: Camel dealetter + Bean strange behaviour
Hello All,
Our general error policy for some parts of our processes is to use a camel
deadletter queue (on file).
What I am trying to do is (sm 3.3.1)
FILE POLLER => CAMEL DEADLETTER => BEAN
In case of error CAMEL would send to a file sender.
So, in an SA we have a bean that make some actions and return DONE or ERROR
depending on the result, what I would expect is that if the bean returns ERROR
camel retries for a number of times and sends to the deadletter, but this is not
done. It is not retrying or sending to deadletter, and my msg disappears (msg
comes from a file poller).
>From other part of the process we are sending an email, which works perfectly
with camel deadletter, retrying and sending to deadletter when necessary.
Probably I am doing wrong but I do not know what.
Below is an example (also, I attached my sample SA):
Thank you in advance.
Javier
====================================================================
BEAN :::
====================================================================
package playground.bean;
import javax.annotation.Resource;
import javax.jbi.messaging.DeliveryChannel;
import javax.jbi.messaging.ExchangeStatus;
import javax.jbi.messaging.MessageExchange;
import javax.jbi.messaging.MessagingException;
import org.apache.servicemix.jbi.listener.MessageExchangeListener;
public class AlwaysErrorBean implements MessageExchangeListener {
@Resource
private DeliveryChannel channel;
@Override
public void onMessageExchange(MessageExchange exchange) throws
MessagingException {
if (exchange.getStatus() != ExchangeStatus.ACTIVE) {
System.out.println("onMessageExchange : RECEIVED NON ACTIVE EXCHANGE
: " + exchange.getStatus().toString());
return;
}
System.out.println(" received message. returning error.");
exchange.setStatus(ExchangeStatus.ERROR);
channel.send(exchange);
}
}
====================================================================
CAMEL ROUTE :::
====================================================================
package playground.camel;
import org.apache.camel.Exchange;
import org.apache.camel.Processor;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.model.InterceptorType;
import org.apache.camel.processor.DelegateProcessor;
public class CamelRouteBuilder extends RouteBuilder {
private final static String JBI_ENDP = "jbi:endpoint:";
private final static String NAMESPACE = "http://playground";
public void configure() throws Exception {
DelegateProcessor proc = new DelegateProcessor(){
public void process(Exchange exchange) throws Exception {
System.out.println(exchange.toString());
processNext(exchange);
}
protected void processNext(Exchange exchange) throws
Exception {
if (processor != null) {
processor.process(exchange);
}
}
};
// ALTERNATIVE 1 : SEND TO ALWAYSERROR BEAN
from(JBI_ENDP+NAMESPACE+"/camelDeadLetter/camelDeadLetterEp")
.errorHandler(deadLetterChannel(JBI_ENDP+NAMESPACE+"/deadLetter/deadLetterEp"))
.to(JBI_ENDP+NAMESPACE+"/alwaysErrorBean/alwaysErrorBeanEp").addInterceptor(proc);
// ALTERNATIVE 2 : SEND TO MAIL COMPONENT
// from(JBI_ENDP+NAMESPACE+"/camelDeadLetter/camelDeadLetterEp")
//
.errorHandler(deadLetterChannel(JBI_ENDP+NAMESPACE+"/deadLetter/deadLetterEp"))
//
.to(JBI_ENDP+NAMESPACE+"/emailSender/emailSenderEp").addInterceptor(proc);
}
}