I was able to work around the issue by writing my own bean implementing 
InitializingBean which takes a reference to the camel context and manually 
calls afterPropertiesSet. This forces the Camel context to start before 
Spring's application context initialization continues. In theory this should 
happen automatically because SpringCamelContext is an InitializingBean but it 
appears to be a bug someplace.

Here's my code that works around it in a class I called 
SpringCamelContextInitializer:

/*
   * (non-Javadoc)
   *
   * @see
   * org.springframework.beans.factory.InitializingBean#afterPropertiesSet()
   */
  public void afterPropertiesSet() throws Exception {
    if (camelContext instanceof SpringCamelContext) {
      SpringCamelContext springCamelContext = (SpringCamelContext) camelContext;

      log.info("Camel context is a SpringCamelContext so it will be initialized 
if needed.");

      if (!springCamelContext.isStarting() && !springCamelContext.isStarted()) {
        log.info("Camel context is not started yet. It will be manually 
initialized.");
        springCamelContext.afterPropertiesSet();
      }
    }
    else {
      log.info("Camel context is not a SpringCamelContext so it will be 
ignored.");
    }
  }

Now setting depends-on="springCamelContextInitializer" on my other code causes 
everything to start up and initialize in the right order. It would be nice to 
know why SpringCamelContext doesn't initialize properly itself.

-mike


[cid:image001.jpg@01CCD056.2CA57EB0] | Mike Pilone | Software Architect, 
Distribution | mpil...@npr.org<mailto:mpil...@npr.org> | o: 202-513-2679  m: 
703-969-7493

From: Mike Pilone [mailto:mpil...@npr.org]
Sent: Wednesday, January 11, 2012 11:24 AM
To: users@camel.apache.org
Subject: SpringCamelContext afterPropertiesSet never called

I'm debugging an issue where my Spring initialized code attempts to use a Camel 
route before the route is initialized. I attempted to fix this by adding 
"depends-on" in my Spring configuration to make my code depend on the 
camelContext but it didn't help. I could see that the context was being 
created, then my code created (which starts executing in another thread), then 
the context was started.

I debugged the SpringCamelContext and found that the afterPropertiesMethod is 
never called which means the context isn't started until onApplicationEvent is 
fired with a ContextRefreshedEvent. A breakpoint in afterPropertiesMethod is 
never triggered so maybeStart() is never called. So the "depends-on" doesn't 
help because Spring considers the SprintCamelContext initialized and allows 
bean creation to continue even though the context is not yet started.

I'm using Spring 3.1.0 and Camel 2.9.0. Is this a known issue? Any suggestions 
for a work-around?

-mike

[cid:image001.jpg@01CCD052.D7C4B3F0] | Mike Pilone | Software Architect, 
Distribution | mpil...@npr.org<mailto:mpil...@npr.org> | o: 202-513-2679  m: 
703-969-7493

Reply via email to