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
>

Reply via email to