Is it possible to get NotifyBuilder to wait on message arrival at various
out/edge jms endpoints within a test? Surely this is what you want to do
most of the time?, ie check your end conditions.

In all the NotifyBuilder examples I've seen the notify conditions are either
very general or on components that are at the start or mid route.

In the test shown (at the end of this email) the properties
{{url.radial-trades}} & {{url.dead-letter}} are expanded to vm/activemq
queues.

The NotifyBuilder's condition never fires and always times out. Now I can
get this working by adding a very general condition and a sleep:

    NotifyBuilder notify = new NotifyBuilder(context).whenDone(5).create();
    boolean matches = notify.create().matches(10, TimeUnit.SECONDS);          
    Thread.sleep(1000);
    // Now assert on browsable queues    

But having that sleep makes the test nondeterministic in my opinion - what
happens if a full GC during test makes it run slower etc. I really dont like
the sleep!

I've tried all of whenDone, whenReceived, whenComplete etc but condition
never fires when expression is on an out endpoint url.

As an aside I noticed that property expansion does not fail/exception with
NotifyBuilder when it is given rubbish, eg:

 NotifyBuilder notify = new NotifyBuilder(context)
      .from("{{this-does-not-exist}}").whenDone(1).create();


Code of failing test due to timeout:
------------------------------------------

/**
 * Test for {@link RadialRouteBuilder}
 */
public class RadialRouteBuilderTestCase extends CamelTestSupport {

  private JndiRegistry registry;

  @Test
  public void testCompleteRoute() throws Exception {

    // Test has completed when all expected trades have hit external
endpoints
    NotifyBuilder notify = new NotifyBuilder(context)
      .from("{{url.radial-trades}}").whenDone(4)
      .from("{{url.dead-letter}}").whenDone(1).create();

    // Fail on timeout after 10 seconds
    boolean matches = notify.create().matches(10, TimeUnit.SECONDS);
    assertTrue("Expected four trade messages to be produced and one dead
letter message", matches);


    // Never get here

    BrowsableEndpoint radialTradesEP =
context.getEndpoint("{{url.radial-trades}}", BrowsableEndpoint.class);
    assertEquals("Radial Trade Messages", 4,
radialTradesEP.getExchanges().size());

    BrowsableEndpoint deadLetterEP =
context.getEndpoint("{{url.dead-letter}}", BrowsableEndpoint.class);
    assertEquals("Dead Letter Messages", 1,
deadLetterEP.getExchanges().size());
  }

  @Override
  protected RouteBuilder createRouteBuilder() throws Exception {
    return new RadialRouteBuilder() {
      @Override
      public void configure() {
        super.configure();
        //Play trades into route's jms queues via an embedded jms broker
       
from("file:src/test/data/radial-route-builder-test-case?noop=true&include=bond_msg.*")
          .to("{{url.tradebus-bond-trades}}");
       
from("file:src/test/data/radial-route-builder-test-case?noop=true&include=future_msg.*")
          .to("{{url.tradebus-future-trades}}");
      }
    };
  }

  @Override
  protected CamelContext createCamelContext() throws Exception {
    CamelContext context = super.createCamelContext();

    //Configure active mq to use embedded broker
    context.addComponent("activemq",
activeMQComponent("vm://localhost?broker.persistent=false"));

    // Load test specific properties
    PropertiesComponent properties =
context.getComponent("properties",PropertiesComponent.class);
    properties.setLocations(new String[]{
      "file:config/config-dev.properties",
      "file:src/test/config/config-test.properties"});

    // Setup spring beans
    RadialBondTradeEventProcessor bondTEP = new
RadialBondTradeEventProcessor();
    bondTEP.setTradeCache(new BasicTradeCache<BondTrade>());
    registry.bind("bondTradeEventProcessor", bondTEP);
    RadialFutureTradeEventProcessor futureTEP = new
RadialFutureTradeEventProcessor();
    futureTEP.setTradeCache(new BasicTradeCache<FutureTrade>());
    registry.bind("futureTradeEventProcessor", futureTEP);

    return context;
  }

  @Override
  protected JndiRegistry createRegistry() throws Exception {
    // Store registry so can register spring beans later
    registry = super.createRegistry();
    return registry;    //To change body of overridden methods use File |
Settings | File Templates.
  }
}







--
View this message in context: 
http://camel.465427.n5.nabble.com/NotifyBuilder-condition-fails-to-match-on-an-out-activemq-endpoint-tp4689038p4689038.html
Sent from the Camel - Users mailing list archive at Nabble.com.

Reply via email to