You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@camel.apache.org by Greg McFall <gr...@gmail.com> on 2011/05/25 17:52:35 UTC
Problem using dead message channel
Hi,
I'm a camel newbie and I'm having trouble with the dead message channel.
In the JUnit test below, I am trying to route dead messages to a mock
endpoint, but the assertion for the expected message count on this endpoint
is failing.
For some reason, messages are not being delivered to the "mock:dead"
endpoint.
I see the following result for this test:
*java.lang.AssertionError: *mock://dead Received message count. Expected:
<2> but was: <0>
Can someone explain what I am doing wrong?
public class DeadLetterTest extends CamelTestSupport {
@EndpointInject(uri = "mock:sink")
protected MockEndpoint sink;
@EndpointInject(uri = "mock:dead")
protected MockEndpoint deadEndpoint;
@Produce(uri = "direct:inbox")
protected ProducerTemplate template;
@Test
public void testDeadLetter() throws Exception {
sink.expectedMessageCount(1);
deadEndpoint.expectedMessageCount(2);
template.sendBody("Hello World");
sink.assertIsSatisfied();
deadEndpoint.assertIsSatisfied();
}
static public class MyService {
int count = 0;
public String enrich(String body) throws Exception {
count++;
if (count < 3) {
throw new Exception("The Service is unavailable");
}
return body + "." + count;
}
}
@Override
protected RouteBuilder createRouteBuilder() {
return new RouteBuilder() {
@Override
public void configure() throws Exception {
errorHandler(
deadLetterChannel("mock:dead")
.maximumRedeliveries(3)
.redeliveryDelay(500)
);
MyService bean = new MyService();
from("direct:inbox")
.bean(bean, "enrich")
.to("mock:sink");
}
};
}
}
Thanks,
~ Greg McFall
Re: Problem using dead message channel
Posted by Greg McFall <gr...@gmail.com>.
Ben,
Thanks for the quick reply. I had assumed that each failure would result in
a message to the dead message queue, but now I understand that a message
goes to the dead message queue only after all redelivery attempts have been
exhausted.
Thanks again!
~ Greg
On Wed, May 25, 2011 at 12:21 PM, boday <be...@initekconsulting.com>wrote:
> hey Greg, given that you configured your error handler to do 3 redelivery
> attempts (before moving to mock:dead), I think the 2nd retry (or 3rd
> message, with MyService.count=3) will succeed and skip the mock:dead
> endpoint...only when all attempts of redelivery have failed, will the
> Exchange be moved to a dead letter endpoint...
>
>
> gmcfall wrote:
> >
> > Hi,
> >
> > I'm a camel newbie and I'm having trouble with the dead message channel.
> >
> > In the JUnit test below, I am trying to route dead messages to a mock
> > endpoint, but the assertion for the expected message count on this
> > endpoint
> > is failing.
> > For some reason, messages are not being delivered to the "mock:dead"
> > endpoint.
> >
> > I see the following result for this test:
> >
> > *java.lang.AssertionError: *mock://dead Received message count. Expected:
> > <2> but was: <0>
> >
> >
> > Can someone explain what I am doing wrong?
> >
> >
> > public class DeadLetterTest extends CamelTestSupport {
> >
> > @EndpointInject(uri = "mock:sink")
> > protected MockEndpoint sink;
> >
> > @EndpointInject(uri = "mock:dead")
> > protected MockEndpoint deadEndpoint;
> > @Produce(uri = "direct:inbox")
> > protected ProducerTemplate template;
> > @Test
> > public void testDeadLetter() throws Exception {
> > sink.expectedMessageCount(1);
> > deadEndpoint.expectedMessageCount(2);
> > template.sendBody("Hello World");
> > sink.assertIsSatisfied();
> > deadEndpoint.assertIsSatisfied();
> > }
> >
> > static public class MyService {
> > int count = 0;
> > public String enrich(String body) throws Exception {
> > count++;
> > if (count < 3) {
> > throw new Exception("The Service is unavailable");
> > }
> > return body + "." + count;
> > }
> > }
> >
> > @Override
> > protected RouteBuilder createRouteBuilder() {
> > return new RouteBuilder() {
> >
> > @Override
> > public void configure() throws Exception {
> > errorHandler(
> > deadLetterChannel("mock:dead")
> > .maximumRedeliveries(3)
> > .redeliveryDelay(500)
> > );
> > MyService bean = new MyService();
> > from("direct:inbox")
> > .bean(bean, "enrich")
> > .to("mock:sink");
> > }
> > };
> > }
> > }
> >
> > Thanks,
> > ~ Greg McFall
> >
>
>
> -----
> Ben O'Day
> IT Consultant -http://benoday.blogspot.com
>
> --
> View this message in context:
> http://camel.465427.n5.nabble.com/Problem-using-dead-message-channel-tp4425741p4425825.html
> Sent from the Camel - Users mailing list archive at Nabble.com.
>
Re: Problem using dead message channel
Posted by boday <be...@initekconsulting.com>.
hey Greg, given that you configured your error handler to do 3 redelivery
attempts (before moving to mock:dead), I think the 2nd retry (or 3rd
message, with MyService.count=3) will succeed and skip the mock:dead
endpoint...only when all attempts of redelivery have failed, will the
Exchange be moved to a dead letter endpoint...
gmcfall wrote:
>
> Hi,
>
> I'm a camel newbie and I'm having trouble with the dead message channel.
>
> In the JUnit test below, I am trying to route dead messages to a mock
> endpoint, but the assertion for the expected message count on this
> endpoint
> is failing.
> For some reason, messages are not being delivered to the "mock:dead"
> endpoint.
>
> I see the following result for this test:
>
> *java.lang.AssertionError: *mock://dead Received message count. Expected:
> <2> but was: <0>
>
>
> Can someone explain what I am doing wrong?
>
>
> public class DeadLetterTest extends CamelTestSupport {
>
> @EndpointInject(uri = "mock:sink")
> protected MockEndpoint sink;
>
> @EndpointInject(uri = "mock:dead")
> protected MockEndpoint deadEndpoint;
> @Produce(uri = "direct:inbox")
> protected ProducerTemplate template;
> @Test
> public void testDeadLetter() throws Exception {
> sink.expectedMessageCount(1);
> deadEndpoint.expectedMessageCount(2);
> template.sendBody("Hello World");
> sink.assertIsSatisfied();
> deadEndpoint.assertIsSatisfied();
> }
>
> static public class MyService {
> int count = 0;
> public String enrich(String body) throws Exception {
> count++;
> if (count < 3) {
> throw new Exception("The Service is unavailable");
> }
> return body + "." + count;
> }
> }
>
> @Override
> protected RouteBuilder createRouteBuilder() {
> return new RouteBuilder() {
>
> @Override
> public void configure() throws Exception {
> errorHandler(
> deadLetterChannel("mock:dead")
> .maximumRedeliveries(3)
> .redeliveryDelay(500)
> );
> MyService bean = new MyService();
> from("direct:inbox")
> .bean(bean, "enrich")
> .to("mock:sink");
> }
> };
> }
> }
>
> Thanks,
> ~ Greg McFall
>
-----
Ben O'Day
IT Consultant -http://benoday.blogspot.com
--
View this message in context: http://camel.465427.n5.nabble.com/Problem-using-dead-message-channel-tp4425741p4425825.html
Sent from the Camel - Users mailing list archive at Nabble.com.