What Camel version do you use? And as always try making simpler unit tests to get it working, eg just a plain onCompletion etc. And in the past there was an bug with using onWhen with onCompletion. So try with latest release of Camel.
On Thu, Nov 14, 2013 at 8:58 AM, cristisor <cristisor...@yahoo.com> wrote: > Hello, > > I'm back with some code. > The mock route builder: > @Component > public class MockedTransactionToDBPublisherRouteBuilder extends > TransactionToDBPublisherRouteBuilder { > > /** > * @throws java.sql.SQLException > */ > public MockedTransactionToDBPublisherRouteBuilder(DataSource datasource, > TransactionTemplate transactionTemplate, String > redeliveryPolicy, ProducerTemplate producer, > ConsumerTemplate consumer) { > super(datasource, transactionTemplate, redeliveryPolicy, producer, > consumer); > } > > /** > * {@inheritDoc} > */ > @Override > protected String getExceptionEndpoint() { > return "mock:exception"; > } > > /** > * {@inheritDoc} > */ > @Override > protected String getDeadLetterEndpoint() { > return "mock:deadletter"; > } > > /** > * {@inheritDoc} > */ > @Override > protected String getInputEndpoint() { > return "direct:input"; > } > > /** > * {@inheritDoc} > */ > @Override > protected String getOutputEndpoint() { > return "mock:output"; > } > } > > > The route initialized in TransactionToDBPublisherRouteBuilder: > protected void createRoute(Processor processor) { > from(getInputEndpoint()) > // when the exchange is a TRANSACTION and is completed > update the number of passed transactions > .onCompletion() > .onCompleteOnly() > > .onWhen(TransactionPredicates.isMessageType(MessageType.TRANSACTION)) > .process(endOfDaySyncProcessor) > .end() > // the onCompletion callback ended and normal processing is > back > .choice() > // the End Of Day must be handled separately since it is > processed after all the TRANSACTIONs > > .when(TransactionPredicates.isMessageType(MessageType.END_OF_DAY)) > .process(endOfDaySyncProcessor) > // let all the other exchanges follow the standard route > // this path can't go through the endOfDaySync route because > we need to intercept the callback > .otherwise() > .process(processor) > .to(getOutputEndpoint()) > .end(); > > // this is the route where the End Of Day go after all the > transactions have been integrated > from(getSyncEndOfDayEndpoint()) > .process(processor) > .to(getOutputEndpoint()); > } > > > The base test class: > @ContextConfiguration(locations = { "transactionToDb-context.xml" }) > abstract public class AbstractTransactionToDBPublisherRouteBuilderTest > extends AbstractJUnit4SpringContextTests { > protected static final String CHARSET = "UTF-8"; > > @Autowired > protected CamelContext camelContext; > > @Autowired > protected DataSource DATA_SOURCE; > > @Autowired > protected TransactionTemplate TRANSACTION_TEMPLATE; > > @EndpointInject(uri = "mock:output") > protected MockEndpoint resultEndpoint; > > @EndpointInject(uri = "mock:exception") > protected MockEndpoint exceptionEndpoint; > > @Produce(uri = "direct:input") > protected ProducerTemplate template; > > @BeforeClass > public static void beforeClass() { > // force jibx to use the staxReaderFactory > System.setProperty("org.jibx.runtime.impl.parser", > "org.jibx.runtime.impl.StAXReaderFactory"); > } > > @Before > public void setUp() throws Exception { > // delete all records from the database > TestUtil.clearDatabase(DATA_SOURCE.getConnection()); > } > > protected Exchange createExchangeWithBodyAndHeader(Object body, > MessageType type) { > Exchange exchange = new DefaultExchange(camelContext); > Message message = exchange.getIn(); > message.setHeader("testClass", getClass().getName()); > message.setHeader(MessageConstant.ERES_CONTENT_TYPE, > type.toString()); > message.setBody(body); > return exchange; > } > } > > > The test: > @Test > public void testRouteWithPendingTransactions() throws Exception { > resultEndpoint.setExpectedMessageCount(4); > > // sending Transaction 1 > InputStream is = > getClass().getClassLoader().getResourceAsStream("Transaction1.xml"); > String msg = TestUtil.getInputStreamAsString(is, CHARSET); > is.close(); > > Exchange exchange = createExchangeWithBodyAndHeader(msg, > MessageType.TRANSACTION); > template.send(exchange); > > // sending Transaction 2 > is = > getClass().getClassLoader().getResourceAsStream("Transaction2.xml"); > msg = TestUtil.getInputStreamAsString(is, CHARSET); > is.close(); > > exchange = createExchangeWithBodyAndHeader(msg, > MessageType.TRANSACTION); > template.send(exchange); > > // sending End Of Process which must wait for 3 transactions to be > processed > is = > getClass().getClassLoader().getResourceAsStream("endBusinessDate.xml"); > msg = TestUtil.getInputStreamAsString(is, CHARSET); > is.close(); > > // turn the End Of Day into Exchange and send them to the Direct > Input > exchange = createExchangeWithBodyAndHeader(msg, > MessageType.END_OF_DAY); > template.send(exchange); > > resultEndpoint.assertIsNotSatisfied(1000); > > // sending Transaction 3, which should trigger the processing of the > End Of Process also > is = > getClass().getClassLoader().getResourceAsStream("Transaction3.xml"); > msg = TestUtil.getInputStreamAsString(is, CHARSET); > is.close(); > > exchange = createExchangeWithBodyAndHeader(msg, > MessageType.TRANSACTION); > template.send(exchange); > > // assert that we got all the messages > resultEndpoint.assertIsSatisfied(1000); > } > > > The syncProcessor is working fine but none of the onCompletion events get to > it. > > Thanks for your support. > > > > -- > View this message in context: > http://camel.465427.n5.nabble.com/onCompletion-not-triggerd-in-testing-tp5743163p5743249.html > Sent from the Camel - Users mailing list archive at Nabble.com. -- Claus Ibsen ----------------- Red Hat, Inc. Email: cib...@redhat.com Twitter: davsclaus Blog: http://davsclaus.com Author of Camel in Action: http://www.manning.com/ibsen