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/