Thanks for your reply.

Tried changing creation of exchange but didnt help. Have added a test case "TestLoad".

Attached maven project.

Thanks,
Sumit Teke
Omniscient Software Pvt Ltd
T. +91-20-26680814, Ext. 217
F. +91-20-26680815, Ext. 212
M. +91-9975709032
E. sumit_t...@omniscient.co.in

On Monday 14 February 2011 07:37 PM, Claus Ibsen wrote:
Hi

You should create the exchange using the endpoint, eg like this

Exchange exchange1 = context.getEndpoint("direct://start").createExchange();

But often its much easier just to use the template

         context.createProducerTemplate().sendBody("direct://start",
"The body here");

And a rule of thumb is to re-use the producer template. There is a FAQ
at the Camel website.
I can't put a link due the apache site is currently down.


On Mon, Feb 7, 2011 at 12:30 PM, Sumit Teke<sumit_t...@omniscient.co.in>  wrote:
Hello,

We have a system where we want to monitor all the exchanges flowing throw
camel pipeline (track completed, inprogress, failed exchanges).

Camel context are added at runtime. We want enrich pipeline to trigger start
and end of work flow, also add error handler to pipeline. Start interceptor
marks exchange as inprogress, end interceptor marks exchange as completed
and error handler marks exchange as failed in the database.

We are loading camel context from spring xml, then in java using
RouteDefination's adviceWith method modifying route to add start, end
intercepters and error handler.

Camel context spring xml:
<camel:camelContext id="default" autoStartup="true">

         <camel:route id="startRoute">
             <camel:from uri="direct:input" />
             <camel:process ref="processor1" />
             <camel:to uri="direct://interm" />
         </camel:route>
....
</camel:camelContext>
Adding error handler using
route.adviceWith(camelContext, new RouteBuilder() {
                 public void configure() throws Exception {

onException(Exception.class).handled(true).process(ERROR_HANDLER);
                 }
             });
Adding start intercepter using
routeDef.adviceWith(camelContext, new RouteBuilder() {
             public void configure() throws Exception {
                 interceptFrom().process(START_INTERCEPTER);
             }
         });
Adding end intercepter using
routeDef.adviceWith(camelContext, new RouteBuilder() {
             public void configure() throws Exception {
                 onCompletion().process(END_INTERCEPTER);
             }
         });


Now when we try to send exchange on input channel using

Exchange exchange1 = new DefaultExchange(context);
exchange1.getIn().setBody("Input1");
context.createProducerTemplate().send("direct://input", exchange1);

it throws NPE and our error handler is called.
java.lang.NullPointerException
     at
org.apache.camel.model.InterceptFromDefinition$1.evaluate(InterceptFromDefinition.java:77)
     at
org.apache.camel.builder.ProcessorBuilder$4.process(ProcessorBuilder.java:94)
     at
org.apache.camel.impl.converter.AsyncProcessorTypeConverter$ProcessorToAsyncProcessorBridge.process(AsyncProcessorTypeConverter.java:50)
     at
org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:70)


When we try to send exchange using

Exchange exchange2 = new DefaultExchange(context);
exchange2.getIn().setBody("Input2");
Endpoint endpoint = context.getEndpoint("direct://input");
exchange2.setFromEndpoint(endpoint);
context.createProducerTemplate().send(endpoint, exchange2);

it pass all the way to pipeline very well. But in case of exception in
pipeline default error handler gets called and not the error handler that we
added.

Are we doing in a wrong way or there is any problem with camel when
modifying routes at runtime.

Any help appreciated in advance.

P.S.: maven project attached.

Regards,
Sumit Teke.



Attachment: camel-sample.tar.gz
Description: GNU Zip compressed data

Reply via email to