I sent the mail below to the Camel mailing list but I'm beginning to think
that it is more of an iPOJO problem than a Camel problem. I would really
appreciate any help since this is extremely confusing to me.
/Bengt
I have a very strange problem that is probably related to classloading. I
use Camel 2.7.1 in Karaf 2.2.0 together with iPOJO.
I create my camel context like this:
@Validate
public void start() {
CamelContextFactory factory = new CamelContextFactory();
factory.setBundleContext(getBundleContext());
mCamelContext = factory.createContext();
RouteBuilder builder = createRouteBuilder();
try {
mCamelContext.addRoutes(builder);
} catch (Exception e) {
e.printStackTrace();
}
try {
mCamelContext.start();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("start, mCamelContext: " + mCamelContext);
}
It is created when the iPOJO component becomes valid. I get the bundle
context in my constructor from iPOJO. The actual routes are created like
this:
private RouteBuilder createRouteBuilder() {
RouteBuilder builder = new RouteBuilder() {
from("file:localdir").process(new Processor() {
public void process(Exchange theExchange) throws Exception {
trigger();
}
});
from("direct:start").process()....to("ftp:....);
}
}
Both routes works fine. When dropping a file in the "localdir", the
trigger() method is called that in turn will send an exchange to the
"direct:start" endpoint that will do the real work. The trigger method looks
like this:
* public void trigger() { *
*
System.out.println("trigger, mCamelContext: " + mCamelContext);
ProducerTemplate producer = mCamelContext.createProducerTemplate();*
* Map<String, Object> headers = new HashMap<String, Object>();*
* // ...populate headers*
* String body;*
* // ... initialize body*
* producer.sendBodyAndHeaders("direct:start", body, headers);*
* }*
*
*
Dropping the file in "localdir" is just for testing purposes. In real life,
the "direct:start" route is meant to be triggered via a published OSGi
service (actually through a web service call). However, this does not work
at all.
Whenever I try to call the trigger() method from somewhere else, the
mCamelContext member is null and I get a NPE when trying to create the
producer template. Why is that?
I realize that this might not be a Camel problem but a OSGi/iPOJO problem
but it's definitely related to Camel. I checked what class loader is being
used to for the mCamelContext instance and it turns out to be the
camel-spring bundle's class loader. Could that be related to my problems?
I am very confused about this and would appreciate any help,
/Bengt