Roy Truelove created CAMEL-9110:
-----------------------------------

             Summary: Camel Proxy not fully ready before needed in another 
bean's init
                 Key: CAMEL-9110
                 URL: https://issues.apache.org/jira/browse/CAMEL-9110
             Project: Camel
          Issue Type: Bug
          Components: camel-core
    Affects Versions: 2.14.1
         Environment: MacOS

java version "1.7.0_51"
Java(TM) SE Runtime Environment (build 1.7.0_51-b13)
Java HotSpot(TM) 64-Bit Server VM (build 24.51-b03, mixed mode)
            Reporter: Roy Truelove


(Can reproduce using this repo: https://github.com/roytruelove/camelBug)

I have:

* An interface {{ExternalService}} which I've proxied using {{camel:proxy}}, 
pointing to {{direct:start}}.
* A class {{UsesExternalServiceDuringInit}} into which the proxy is injected. 
During its Spring {{afterPropertiesSet()}} initialization method, the proxy is 
used.
* A route which defines the {{direct:start}} endpoint.

The full stack trace can be found below, but the core error that I get when 
starting Spring is

{code}
No consumers available on endpoint: Endpoint[direct://start]. Exchange[Message: 
BeanInvocation public abstract java.lang.String 
org.apache.camel.example.spring.ExternalService.someMethodOnExternalService() 
with null]]
{code}

What it looks like is happening (and feel free to correct!) is:

* Because {{UsesExternalServiceDuringInit}} depends on the {{camel}} bean, 
{{afterPropertiesSet()}} is called on {{SpringCamelContext}}, but this does not 
start the routes.
* {{afterPropertiesSet()}} is called on {{UsesExternalServiceDuringInit}}, 
expecting its instance of {{ExternalService}} to be ready to use.
* The routes are not started, so {{direct:start}} is not yet consuming and the 
init fails.

>From what I see the starting of the routes happens once the spring context is 
>fully initialized, meaning that any calls to the proxy during spring's init 
>will fail.

I don't yet have an idea for a fix / workaround - will update if I find one.

Full stack trace if needed:

{code}
java.lang.reflect.InvocationTargetException
        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.camel.maven.RunMojo$1.run(RunMojo.java:488)
        at java.lang.Thread.run(Thread.java:744)
Caused by: org.springframework.beans.factory.BeanCreationException: Error 
creating bean with name 
'org.apache.camel.example.spring.UsesExternalServiceDuringInit#0' defined in 
file 
[/Users/roytruelove/src/personal/camel-bugfix2/target/classes/META-INF/spring/camel-context.xml]:
 Invocation of init method failed; nested exception is 
java.lang.reflect.UndeclaredThrowableException
        at 
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1514)
        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:191)
        at 
org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:636)
        at 
org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:934)
        at 
org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:479)
        at 
org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
        at 
org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:93)
        at 
org.apache.camel.spring.Main.createDefaultApplicationContext(Main.java:217)
        at org.apache.camel.spring.Main.doStart(Main.java:157)
        at org.apache.camel.support.ServiceSupport.start(ServiceSupport.java:61)
        at org.apache.camel.main.MainSupport.run(MainSupport.java:149)
        at org.apache.camel.main.MainSupport.run(MainSupport.java:353)
        at org.apache.camel.spring.Main.main(Main.java:90)
        ... 6 more
Caused by: java.lang.reflect.UndeclaredThrowableException
        at com.sun.proxy.$Proxy45.someMethodOnExternalService(Unknown Source)
        at 
org.apache.camel.example.spring.UsesExternalServiceDuringInit.afterPropertiesSet(UsesExternalServiceDuringInit.java:11)
        at 
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1573)
        at 
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1511)
        ... 23 more
Caused by: 
org.apache.camel.component.direct.DirectConsumerNotAvailableException: No 
consumers available on endpoint: Endpoint[direct://start]. Exchange[Message: 
BeanInvocation public abstract java.lang.String 
org.apache.camel.example.spring.ExternalService.someMethodOnExternalService() 
with null]]
        at 
org.apache.camel.component.direct.DirectProducer.process(DirectProducer.java:38)
        at 
org.apache.camel.component.bean.AbstractCamelInvocationHandler$1.call(AbstractCamelInvocationHandler.java:110)
        at java.util.concurrent.FutureTask.run(FutureTask.java:262)
        at 
org.apache.camel.component.bean.AbstractCamelInvocationHandler.invokeWithBody(AbstractCamelInvocationHandler.java:128)
        at 
org.apache.camel.component.bean.CamelInvocationHandler.doInvokeProxy(CamelInvocationHandler.java:45)
        at 
org.apache.camel.component.bean.AbstractCamelInvocationHandler.invoke(AbstractCamelInvocationHandler.java:82)
        ... 27 more
{code}






--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to