Hi,

Assuming that the bean initialization order is the cause.

This is not a Camel question. And that is the hint for the solution. It can be 
solved using Spring. Check the depends-on feature on Spring Context to control 
the bean initialization order.

See:

http://docs.spring.io/spring/docs/1.2.x/reference/beans.html

<bean id="beanOne" class="ExampleBean" depends-on="manager">
  <property name="manager"><ref local="manager"/></property>
</bean>
<bean id="manager" class="ManagerBean"/>

Prajod

-----Original Message-----
From: Alexander Krauss [mailto:[email protected]] 
Sent: Wednesday, August 20, 2014 4:38 AM
To: [email protected]
Subject: Non-deterministic Camel context startup failure

Dear list,

I am getting weird non-deterministic behaviour when constructing a simple Camel 
context. The real thing is in a complex enterprise application, but I managed 
to strip it down to a really simple and self-contained test case 
(self-contained maven project at 
https://github.com/alexkrauss/camel-spring-issue).

In essence, I have a RouteBuilder instance defining two trivial routes, and a 
processor, which consumes messages from one route and feeds it into the other 
(via ProducerTemplate).

What I observe is that sometimes (roughly 5-20% of the cases, without changing 
anything), the camel context initialization fails with the exception pasted 
below.
When comparing the DEBUG logs, it seems that there is a subtle dependency on 
the bean creation order, which seems to be nondeterministic.

Can anybody give helpful insight on why this is happening and how to avoid it?

Thanks
Alex



java.lang.IllegalStateException: Failed to load ApplicationContext at 
org.springframework.test.context.CacheAwareContextLoaderDelegate.loadContext(CacheAwareContextLoaderDelegate.java:99)
at 
org.springframework.test.context.TestContext.getApplicationContext(TestContext.java:122)
at 
org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:109)
at 
org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:75)
at 
org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:321)
at 
org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:211)
at 
org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:288)
at 
org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at 
org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:284)
at 
org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231)
at 
org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:88)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
at 
org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at 
org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71)
at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
at 
org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:174)
at 
org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:252)
at 
org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:141)
at 
org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:112)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at 
org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:189)
at 
org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:165)
at 
org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:85)
at 
org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:115)
at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:75)
Caused by: org.springframework.beans.factory.BeanCreationException:
Error creating bean with name 'route': Injection of autowired dependencies 
failed; nested exception is
org.springframework.beans.factory.BeanCreationException: Could not autowire 
field: private org.myexample.camelissue.MyProcessor
org.myexample.camelissue.MyRoute.myProcessor; nested exception is
org.springframework.beans.factory.BeanCreationException: Error creating bean 
with name 'processor' defined in class
org.myexample.camelissue.ContextStartupTest$Context: Initialization of bean 
failed; nested exception is
org.springframework.beans.factory.BeanCreationException: Error creating bean 
with name 'camelContext' defined in class
org.myexample.camelissue.ContextStartupTest$Context: Invocation of init method 
failed; nested exception is
org.apache.camel.FailedToCreateRouteException: Failed to create route
route1 at: >>> process[null] <<< in route:
Route(route1)[[From[direct:foo]] -> [process[null]]] because of ref must be 
specified on: process[null] at 
org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:289)
at 
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1147)
at 
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
at 
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458)
at 
org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:293)
at 
org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)
at 
org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:290)
at 
org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:191)
at 
org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:633)
at 
org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:932)
at 
org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:479)
at 
org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:120)
at 
org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:60)
at 
org.springframework.test.context.support.AbstractDelegatingSmartContextLoader.delegateLoading(AbstractDelegatingSmartContextLoader.java:100)
at 
org.springframework.test.context.support.AbstractDelegatingSmartContextLoader.loadContext(AbstractDelegatingSmartContextLoader.java:248)
at 
org.springframework.test.context.CacheAwareContextLoaderDelegate.loadContextInternal(CacheAwareContextLoaderDelegate.java:64)
at 
org.springframework.test.context.CacheAwareContextLoaderDelegate.loadContext(CacheAwareContextLoaderDelegate.java:91)
... 31 more
Caused by: org.springframework.beans.factory.BeanCreationException:
Could not autowire field: private org.myexample.camelissue.MyProcessor
org.myexample.camelissue.MyRoute.myProcessor; nested exception is
org.springframework.beans.factory.BeanCreationException: Error creating bean 
with name 'processor' defined in class
org.myexample.camelissue.ContextStartupTest$Context: Initialization of bean 
failed; nested exception is
org.springframework.beans.factory.BeanCreationException: Error creating bean 
with name 'camelContext' defined in class
org.myexample.camelissue.ContextStartupTest$Context: Invocation of init method 
failed; nested exception is
org.apache.camel.FailedToCreateRouteException: Failed to create route
route1 at: >>> process[null] <<< in route:
Route(route1)[[From[direct:foo]] -> [process[null]]] because of ref must be 
specified on: process[null] at 
org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:517)
at 
org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87)
at 
org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:286)
... 47 more
Caused by: org.springframework.beans.factory.BeanCreationException:
Error creating bean with name 'processor' defined in class
org.myexample.camelissue.ContextStartupTest$Context: Initialization of bean 
failed; nested exception is
org.springframework.beans.factory.BeanCreationException: Error creating bean 
with name 'camelContext' defined in class
org.myexample.camelissue.ContextStartupTest$Context: Invocation of init method 
failed; nested exception is
org.apache.camel.FailedToCreateRouteException: Failed to create route
route1 at: >>> process[null] <<< in route:
Route(route1)[[From[direct:foo]] -> [process[null]]] because of ref must be 
specified on: process[null] at 
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:529)
at 
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458)
at 
org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:293)
at 
org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)
at 
org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:290)
at 
org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:191)
at 
org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:917)
at 
org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:860)
at 
org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:775)
at 
org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:489)
... 49 more
Caused by: org.springframework.beans.factory.BeanCreationException:
Error creating bean with name 'camelContext' defined in class
org.myexample.camelissue.ContextStartupTest$Context: Invocation of init method 
failed; nested exception is
org.apache.camel.FailedToCreateRouteException: Failed to create route
route1 at: >>> process[null] <<< in route:
Route(route1)[[From[direct:foo]] -> [process[null]]] because of ref must be 
specified on: process[null] at 
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1513)
at 
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:521)
at 
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458)
at 
org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:293)
at 
org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)
at 
org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:290)
at 
org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195)
at 
org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:441)
at 
org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:431)
at 
org.springframework.context.support.AbstractApplicationContext.getBeansOfType(AbstractApplicationContext.java:1182)
at 
org.apache.camel.spring.CamelBeanPostProcessor$1.getOrLookupCamelContext(CamelBeanPostProcessor.java:73)
at 
org.apache.camel.spring.CamelBeanPostProcessor$1$1.getCamelContext(CamelBeanPostProcessor.java:106)
at 
org.apache.camel.impl.CamelPostProcessorHelper.createInjectionProducerTemplate(CamelPostProcessorHelper.java:280)
at 
org.apache.camel.impl.CamelPostProcessorHelper.getInjectionValue(CamelPostProcessorHelper.java:198)
at 
org.apache.camel.impl.DefaultCamelBeanPostProcessor.injectField(DefaultCamelBeanPostProcessor.java:195)
at 
org.apache.camel.impl.DefaultCamelBeanPostProcessor$1.doWith(DefaultCamelBeanPostProcessor.java:187)
at org.apache.camel.util.ReflectionHelper.doWithFields(ReflectionHelper.java:73)
at 
org.apache.camel.impl.DefaultCamelBeanPostProcessor.injectFields(DefaultCamelBeanPostProcessor.java:168)
at 
org.apache.camel.impl.DefaultCamelBeanPostProcessor.postProcessBeforeInitialization(DefaultCamelBeanPostProcessor.java:82)
at 
org.apache.camel.spring.CamelBeanPostProcessor.postProcessBeforeInitialization(CamelBeanPostProcessor.java:148)
at 
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:396)
at 
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1506)
at 
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:521)
... 58 more
Caused by: org.apache.camel.FailedToCreateRouteException: Failed to create 
route route1 at: >>> process[null] <<< in route:
Route(route1)[[From[direct:foo]] -> [process[null]]] because of ref must be 
specified on: process[null] at 
org.apache.camel.model.RouteDefinition.addRoutes(RouteDefinition.java:910)
at org.apache.camel.model.RouteDefinition.addRoutes(RouteDefinition.java:175)
at 
org.apache.camel.impl.DefaultCamelContext.startRoute(DefaultCamelContext.java:780)
at 
org.apache.camel.impl.DefaultCamelContext.startRouteDefinitions(DefaultCamelContext.java:2068)
at 
org.apache.camel.impl.DefaultCamelContext.doStartCamel(DefaultCamelContext.java:1816)
at 
org.apache.camel.impl.DefaultCamelContext.doStart(DefaultCamelContext.java:1683)
at org.apache.camel.support.ServiceSupport.start(ServiceSupport.java:61)
at 
org.apache.camel.impl.DefaultCamelContext.start(DefaultCamelContext.java:1651)
at 
org.apache.camel.spring.SpringCamelContext.maybeStart(SpringCamelContext.java:254)
at 
org.apache.camel.spring.SpringCamelContext.afterPropertiesSet(SpringCamelContext.java:106)
at 
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1572)
at 
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1510)
... 80 more
Caused by: java.lang.IllegalArgumentException: ref must be specified
on: process[null]
at org.apache.camel.util.ObjectHelper.notNull(ObjectHelper.java:316)
at 
org.apache.camel.model.ProcessDefinition.createProcessor(ProcessDefinition.java:90)
at 
org.apache.camel.model.ProcessorDefinition.makeProcessor(ProcessorDefinition.java:499)
at 
org.apache.camel.model.ProcessorDefinition.addRoutes(ProcessorDefinition.java:212)
at org.apache.camel.model.RouteDefinition.addRoutes(RouteDefinition.java:907)
... 91 more

The information contained in this electronic message and any attachments to 
this message are intended for the exclusive use of the addressee(s) and may 
contain proprietary, confidential or privileged information. If you are not the 
intended recipient, you should not disseminate, distribute or copy this e-mail. 
Please notify the sender immediately and destroy all copies of this message and 
any attachments. 

WARNING: Computer viruses can be transmitted via email. The recipient should 
check this email and any attachments for the presence of viruses. The company 
accepts no liability for any damage caused by any virus transmitted by this 
email.

www.wipro.com

Reply via email to