camel-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Bengt Rodehav <be...@rodehav.com>
Subject Problems triggering a camel route in OSGi
Date Mon, 30 May 2011 12:22:15 GMT
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