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

Reply via email to