You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@camel.apache.org by "Roy Truelove (JIRA)" <ji...@apache.org> on 2015/09/02 16:42:46 UTC

[jira] [Created] (CAMEL-9110) Camel Proxy not fully ready before needed in another bean's init

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)