felix-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Bengt Rodehav <be...@rodehav.com>
Subject Re: iPOJO and CamelContext problems (was "Problems triggering a camel route in OSGi")
Date Mon, 30 May 2011 13:53:56 GMT
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 <bengt@rodehav.com>

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

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message