Thanks Claus, since I don't have routeId's I searched the NotifyBuilder javadocs and found wereSentTo(...). I was able to use this to match the routes which are not the inbound entry point.
This works: @Testpublic void testNotify() { NotifyBuilder notifierA = new NotifyBuilder(camelContext) .from("direct:route-a") .whenDone(1) .create(); NotifyBuilder notifierB = new NotifyBuilder(camelContext) .wereSentTo("direct:route-b") .whenDone(1) .create(); NotifyBuilder notifierDead = new NotifyBuilder(camelContext) .wereSentTo("direct:dead-letter") .whenDone(1) .create(); producerTemplate.sendBody("direct:route-a", null); assertThat(list).containsExactly("a", "b", "dead"); assertThat(notifierA.matches(5, TimeUnit.SECONDS)).isTrue(); assertThat(notifierB.matches(5, TimeUnit.SECONDS)).isTrue(); assertThat(notifierDead.matches(5, TimeUnit.SECONDS)).isTrue(); } On Thu, 11 Jul 2024 at 12:04, Claus Ibsen <claus.ib...@gmail.com> wrote: > Hi > > whenFrom is from the original route, so that would be "direct:route-a" > > You can use fromCurrentRoute (route id based) instead > > On Thu, Jul 11, 2024 at 12:16 PM Lance Java > <lance.j...@googlemail.com.invalid> wrote: > > > I asked this question on stack overflow but didn't get a response so > asking > > here > > > > > https://stackoverflow.com/questions/78720143/camel-notifybuilder-does-not-match-when-exception-is-thrown > > > > It seems that camel's NotifyBuilder > > <https://camel.apache.org/manual/notify-builder.html> works in normal > > message processing but does not work when exceptions are thrown. > > > > Please see the following test case where I create the following routes > > > > - direct:route-a adds "a" to a list and passes to direct:route-b > > - direct:route-b adds "b" to a list and throws exception > > - errorHandler routes to direct:dead-letter as a deadLetterChannel > > - direct:dead-letter adds "dead" to a list > > > > I can see that the list contains "a", "b", "dead" when I send a message > to > > direct:route-a > > > > But the NotifyBuilders for direct:route-b and direct:dead-letter don't > > match for some reason. > > > > Is there a bug in NotifyBuilder where they don't match when exceptions > are > > thrown? Am I using NotifyBuilder incorrectly? I've tried both > > NotifyBuilder.whenDone(1) and NotifyBuilder.whenFailed(1) and neither > > causes a match. > > > > Looking at the NotifyBuilder javadoc > > < > > > https://www.javadoc.io/doc/org.apache.camel/camel-core/2.25.4/org/apache/camel/builder/NotifyBuilder.html#whenDone-int- > > > > > I > > see the following comment for whenDone(...) > > > > > The difference between done and completed is that done can also include > > failed messages, where as completed is only successful processed > messages. > > > > import lombok.extern.slf4j.Slf4j;import > > org.apache.camel.CamelContext;import > > org.apache.camel.ProducerTemplate;import > > org.apache.camel.builder.NotifyBuilder;import > > org.apache.camel.builder.RouteBuilder;import > > org.apache.camel.impl.DefaultCamelContext;import > > org.apache.camel.impl.engine.DefaultProducerTemplate;import > > org.junit.jupiter.api.AfterEach;import > > org.junit.jupiter.api.BeforeEach;import org.junit.jupiter.api.Test; > > import java.util.LinkedList;import java.util.List;import > > java.util.concurrent.TimeUnit; > > import static org.assertj.core.api.Assertions.assertThat; > > @Slf4jpublic class NotifyBuilderTest { > > private CamelContext camelContext; > > private ProducerTemplate producerTemplate; > > private List<String> list; > > > > @BeforeEach > > public void beforeEach() throws Exception { > > list = new LinkedList<>(); > > camelContext = new DefaultCamelContext(); > > > > camelContext.addRoutes(new RouteBuilder() { > > @Override > > public void configure() { > > from("direct:route-a") > > .process(exchange -> list.add("a")) > > .to("direct:route-b"); > > > > from("direct:route-b") > > .process(exchange -> list.add("b")) > > .process(exchange -> { throw new > Exception("foo"); > > }); > > > > errorHandler(deadLetterChannel("direct:dead-letter")); > > > > from("direct:dead-letter") > > .process(exchange -> list.add("dead")); > > } > > }); > > producerTemplate = new DefaultProducerTemplate(camelContext); > > > > camelContext.start(); > > producerTemplate.start(); > > } > > > > @AfterEach > > public void afterEach() { > > producerTemplate.stop(); > > camelContext.stop(); > > } > > > > @Test > > public void testNotify() { > > NotifyBuilder notifierA = new NotifyBuilder(camelContext) > > .from("direct:route-a") > > .whenDone(1) > > .create(); > > NotifyBuilder notifierB = new NotifyBuilder(camelContext) > > .from("direct:route-b") > > .whenDone(1) > > .create(); > > NotifyBuilder notifierDead = new NotifyBuilder(camelContext) > > .from("direct:dead-letter") > > .whenDone(1) > > .create(); > > > > producerTemplate.sendBody("direct:route-a", null); > > > > // this succeeds > > assertThat(list).containsExactly("a", "b", "dead"); > > > > // this succeeds > > assertThat(notifierA.matches(5, TimeUnit.SECONDS)).isTrue(); > > > > // this fails > > assertThat(notifierB.matches(5, TimeUnit.SECONDS)).isTrue(); > > > > // this fails > > assertThat(notifierDead.matches(5, TimeUnit.SECONDS)).isTrue(); > > } > > } > > > > > -- > Claus Ibsen > ----------------- > @davsclaus > Camel in Action 2: https://www.manning.com/ibsen2 >