I added a system.out to see what "this" is in the two methods start() and trigger() respectively. It turns out that "this" is different in those two methods which I guess means that iPOJO has created two instances of my class and in one of them I initialised the mCamelContext but in the other I didn't. I now assume that this is an iPOJO problem (or a lack of understanding on my part).
Does anyone know how this can happen? Shouldn't "this" be the same in both of these methods? The start() (@Validate) and stop() (@Invalidate) are only called once. /Bengt 2011/5/30 Bengt Rodehav <[email protected]> > 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 > >

