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.
>



-- 
Claus Ibsen
-----------------
FuseSource
Email: cib...@fusesource.com
Web: http://fusesource.com
Twitter: davsclaus
Blog: http://davsclaus.blogspot.com/
Author of Camel in Action: http://www.manning.com/ibsen/

Reply via email to