Hi
There is a typo bug here
> + if (localName.equals("template") ||
> localName.equals("consumerTemplat")
And beware that setting a runtime dependency in Spring can cause it to
skip post processing so we should ensure it works. The problem was
before that all the @annotations was not processed on route builders
and some other beans as well.
So check whether Spring INFO/DEBUG logs something about "bean XXX is
not eligible for" then we have a problem.
On Mon, Aug 3, 2009 at 2:56 PM, <[email protected]> wrote:
> Author: ningjiang
> Date: Mon Aug 3 12:56:31 2009
> New Revision: 800340
>
> URL: http://svn.apache.org/viewvc?rev=800340&view=rev
> Log:
> CAMEL-1873 fixed the ambiguity of more than one camel context in the same
> spring application context
>
> Removed:
>
> camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/SpringConsumerTemplateCAMEL1870Test.java
>
> camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/SpringConsumerTemplateCAMEL1870Test-context.xml
> Modified:
>
> camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/CamelBeanPostProcessor.java
>
> camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/CamelConsumerTemplateFactoryBean.java
>
> camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/CamelProducerTemplateFactoryBean.java
>
> camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/handler/CamelNamespaceHandler.java
>
> camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/CamelContextAwareTest.java
>
> camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/camelContextAwareBean.xml
>
> camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/remoting/spring-with-exporter-namespace.xml
>
> Modified:
> camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/CamelBeanPostProcessor.java
> URL:
> http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/CamelBeanPostProcessor.java?rev=800340&r1=800339&r2=800340&view=diff
> ==============================================================================
> ---
> camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/CamelBeanPostProcessor.java
> (original)
> +++
> camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/CamelBeanPostProcessor.java
> Mon Aug 3 12:56:31 2009
> @@ -53,7 +53,7 @@
> * {...@link org.apache.camel.RecipientList} for creating <a
> href="http://camel.apache.org/recipientlist-annotation.html">a Recipient List
> router via annotations</a>.
> * <p>
> * If you use the <camelContext> element in your <a
> href="http://camel.apache.org/spring.html">Spring XML</a>
> - * then one of these bean post processors is implicity installed and
> configured for you. So you should never have to
> + * then one of these bean post processors is implicitly installed and
> configured for you. So you should never have to
> * explicitly create or configure one of these instances.
> *
> * @version $Revision$
> @@ -91,7 +91,7 @@
> injectFields(bean);
> injectMethods(bean);
>
> - if (bean instanceof CamelContextAware) {
> + if (bean instanceof CamelContextAware && canSetCamelContext(bean,
> beanName)) {
> CamelContextAware contextAware = (CamelContextAware)bean;
> if (camelContext == null) {
> LOG.warn("No CamelContext defined yet so cannot inject into:
> " + bean);
> @@ -170,6 +170,29 @@
> // all other beans can of course be processed
> return true;
> }
> +
> +
> + protected boolean canSetCamelContext(Object bean, String beanName) {
> +
> + try {
> + Method method = null;
> + try {
> + method = bean.getClass().getMethod("getCamelContext", new
> Class[]{});
> + } catch (NoSuchMethodException ex) {
> + method = bean.getClass().getMethod("getContext", new
> Class[]{});
> + }
> + CamelContext context = (CamelContext) method.invoke(bean, new
> Object[]{});
> + if (context != null) {
> + if (LOG.isTraceEnabled()) {
> + LOG.trace("The camel context of " + beanName + " is set,
> so we skip inject the camel context of it.");
> + }
> + return false;
> + }
> + } catch (Exception e) {
> + // can't check the status of camelContext , so return true by
> default
> + }
> + return true;
> + }
>
> /**
> * A strategy method to allow implementations to perform some custom JBI
>
> Modified:
> camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/CamelConsumerTemplateFactoryBean.java
> URL:
> http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/CamelConsumerTemplateFactoryBean.java?rev=800340&r1=800339&r2=800340&view=diff
> ==============================================================================
> ---
> camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/CamelConsumerTemplateFactoryBean.java
> (original)
> +++
> camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/CamelConsumerTemplateFactoryBean.java
> Mon Aug 3 12:56:31 2009
> @@ -55,7 +55,7 @@
> }
>
> public boolean isSingleton() {
> - return true;
> + return false;
> }
>
> // Properties
>
> Modified:
> camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/CamelProducerTemplateFactoryBean.java
> URL:
> http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/CamelProducerTemplateFactoryBean.java?rev=800340&r1=800339&r2=800340&view=diff
> ==============================================================================
> ---
> camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/CamelProducerTemplateFactoryBean.java
> (original)
> +++
> camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/CamelProducerTemplateFactoryBean.java
> Mon Aug 3 12:56:31 2009
> @@ -68,7 +68,7 @@
> }
>
> public boolean isSingleton() {
> - return true;
> + return false;
> }
>
> // Properties
>
> Modified:
> camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/handler/CamelNamespaceHandler.java
> URL:
> http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/handler/CamelNamespaceHandler.java?rev=800340&r1=800339&r2=800340&view=diff
> ==============================================================================
> ---
> camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/handler/CamelNamespaceHandler.java
> (original)
> +++
> camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/handler/CamelNamespaceHandler.java
> Mon Aug 3 12:56:31 2009
> @@ -16,8 +16,10 @@
> */
> package org.apache.camel.spring.handler;
>
> +import java.util.ArrayList;
> import java.util.HashMap;
> import java.util.HashSet;
> +import java.util.List;
> import java.util.Map;
> import java.util.Set;
>
> @@ -70,17 +72,18 @@
> }
>
> public void init() {
> - // remoting
> - addBeanDefinitionParser("proxy", CamelProxyFactoryBean.class);
> - addBeanDefinitionParser("template",
> CamelProducerTemplateFactoryBean.class);
> - addBeanDefinitionParser("consumerTemplate",
> CamelConsumerTemplateFactoryBean.class);
> - addBeanDefinitionParser("export", CamelServiceExporter.class);
> + // These elements parser should be used inside the camel context
> + addBeanDefinitionParser("proxy", CamelProxyFactoryBean.class, false);
> + addBeanDefinitionParser("template",
> CamelProducerTemplateFactoryBean.class, false);
> + addBeanDefinitionParser("consumerTemplate",
> CamelConsumerTemplateFactoryBean.class, false);
> + addBeanDefinitionParser("export", CamelServiceExporter.class, false);
>
> - // jmx agent
> - addBeanDefinitionParser("jmxAgent", CamelJMXAgentDefinition.class);
> + // jmx agent cannot be used outside of the camel context
> + addBeanDefinitionParser("jmxAgent", CamelJMXAgentDefinition.class,
> false);
>
> // endpoint
> - addBeanDefinitionParser("endpoint", CamelEndpointFactoryBean.class);
> + // This element cannot be used out side of camel context
> + addBeanDefinitionParser("endpoint", CamelEndpointFactoryBean.class,
> false);
>
> // camel context
> boolean osgi = false;
> @@ -104,10 +107,16 @@
> }
> registerParser("camelContext", new
> CamelContextBeanDefinitionParser(cl));
> }
> -
> +
> private void addBeanDefinitionParser(String elementName, Class<?> type) {
> + addBeanDefinitionParser(elementName, type, true);
> + }
> +
> + private void addBeanDefinitionParser(String elementName, Class<?> type,
> boolean register) {
> BeanDefinitionParser parser = new BeanDefinitionParser(type);
> - registerParser(elementName, parser);
> + if (register) {
> + registerParser(elementName, parser);
> + }
> parserMap.put(elementName, parser);
> }
>
> @@ -215,6 +224,7 @@
>
> boolean createdBeanPostProcessor = false;
> NodeList list = element.getChildNodes();
> + List beans = new ArrayList();
> int size = list.getLength();
> for (int i = 0; i < size; i++) {
> Node child = list.item(i);
> @@ -236,12 +246,18 @@
> if (localName.equals("jmxAgent")) {
>
> builder.addPropertyReference("camelJMXAgent", id);
> }
> + // set the templates with the camel context
> + if (localName.equals("template") ||
> localName.equals("consumerTemplat")
> + || localName.equals("proxy") ||
> localName.equals("export")) {
> + // set the camel context
> +
> definition.getPropertyValues().addPropertyValue("camelContext", new
> RuntimeBeanReference(contextId));
> + }
> }
> }
> -
> }
> }
> }
> +
>
> // register as endpoint defined indirectly in the routes by
> from/to types having id explict set
> registerEndpointsWithIdsDefinedInFromOrToTypes(element,
> parserContext, contextId);
>
> Modified:
> camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/CamelContextAwareTest.java
> URL:
> http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/CamelContextAwareTest.java?rev=800340&r1=800339&r2=800340&view=diff
> ==============================================================================
> ---
> camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/CamelContextAwareTest.java
> (original)
> +++
> camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/CamelContextAwareTest.java
> Mon Aug 3 12:56:31 2009
> @@ -16,6 +16,7 @@
> */
> package org.apache.camel.spring;
>
> +import java.lang.reflect.Method;
> import java.util.Map;
>
> import org.apache.camel.ProducerTemplate;
> @@ -27,28 +28,31 @@
> * @version $Revision$
> */
> public class CamelContextAwareTest extends SpringTestSupport {
> - protected CamelContextAwareBean bean;
> + protected CamelContextAwareBean bean1;
>
> - public void testInjectionPoints() throws Exception {
> - assertNotNull("No CamelContext injected!", bean.getCamelContext());
> - Map<String, String> properties =
> bean.getCamelContext().getProperties();
> +
> + public void xtestInjectionPoints() throws Exception {
> + assertNotNull("No CamelContext injected!", bean1.getCamelContext());
> + Map<String, String> properties =
> bean1.getCamelContext().getProperties();
> assertNotNull("the properties should not been null", properties);
> assertEquals("No properties injected", properties.size(), 1);
> - assertEquals("Should get the value of org.apache.camel.test",
> properties.get("org.apache.camel.test"), "this is a test second");
> + assertEquals("Should get the value of org.apache.camel.test",
> properties.get("org.apache.camel.test"), "this is a test first");
> }
>
> public void testCamelTemplates() throws Exception {
> DefaultProducerTemplate producer1 =
> getMandatoryBean(DefaultProducerTemplate.class, "producer1");
> - // The producer is injected with a wrong camel context
> - assertEquals("Inject a wrong camel context",
> producer1.getContext().getName(), "camel2");
> + assertEquals("Inject a wrong camel context",
> producer1.getContext().getName(), "camel1");
> +
> + DefaultProducerTemplate producer2 =
> getMandatoryBean(DefaultProducerTemplate.class, "producer2");
> + assertEquals("Inject a wrong camel context",
> producer2.getContext().getName(), "camel2");
> }
>
> @Override
> protected void setUp() throws Exception {
> super.setUp();
> -
> - bean = getMandatoryBean(CamelContextAwareBean.class, "bean");
> + bean1 = getMandatoryBean(CamelContextAwareBean.class, "bean1");
> }
> +
>
> protected AbstractXmlApplicationContext createApplicationContext() {
> return new
> ClassPathXmlApplicationContext("org/apache/camel/spring/camelContextAwareBean.xml");
>
> Modified:
> camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/camelContextAwareBean.xml
> URL:
> http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/camelContextAwareBean.xml?rev=800340&r1=800339&r2=800340&view=diff
> ==============================================================================
> ---
> camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/camelContextAwareBean.xml
> (original)
> +++
> camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/camelContextAwareBean.xml
> Mon Aug 3 12:56:31 2009
> @@ -17,26 +17,25 @@
> -->
> <beans xmlns="http://www.springframework.org/schema/beans"
> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
> + xmlns:camel="http://camel.apache.org/schema/spring"
> xsi:schemaLocation="
> http://www.springframework.org/schema/beans
> http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
> http://camel.apache.org/schema/spring
> http://camel.apache.org/schema/spring/camel-spring.xsd
> ">
>
> - <camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
> + <camelContext id="camel1" xmlns="http://camel.apache.org/schema/spring">
> <properties>
> <property key="org.apache.camel.test" value="this is a test first"/>
> </properties>
> <template id="producer1"/>
> </camelContext>
>
> - <camelContext id="camel2" xmlns="http://camel.apache.org/schema/spring">
> - <properties>
> - <property key="org.apache.camel.test" value="this is a test second"/>
> - </properties>
> - <template id="producer2"/>
> - </camelContext>
> + <camel:camelContext id="camel2">
> + <camel:template id="producer2"/>
> + </camel:camelContext>
> +
> + <bean id="bean1" class="org.apache.camel.spring.CamelContextAwareBean">
> + <property name="camelContext" ref="camel1" />
> + </bean>
>
> - <bean id="bean" class="org.apache.camel.spring.CamelContextAwareBean"/>
> -
> -
> </beans>
>
> Modified:
> camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/remoting/spring-with-exporter-namespace.xml
> URL:
> http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/remoting/spring-with-exporter-namespace.xml?rev=800340&r1=800339&r2=800340&view=diff
> ==============================================================================
> ---
> camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/remoting/spring-with-exporter-namespace.xml
> (original)
> +++
> camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/remoting/spring-with-exporter-namespace.xml
> Mon Aug 3 12:56:31 2009
> @@ -23,21 +23,23 @@
> http://camel.apache.org/schema/spring
> http://camel.apache.org/schema/spring/camel-spring.xsd
> ">
>
> - <!-- START SNIPPET: proxy -->
> - <!-- Creates a proxy to the direct:say endpoint. -->
> - <camel:proxy id="sayProxy" serviceUrl="direct:say"
> -
> serviceInterface="org.apache.camel.spring.remoting.ISay"/>
> - <!-- END SNIPPET: proxy -->
> -
> - <!-- START SNIPPET: export -->
> <bean id="sayService" class="org.apache.camel.spring.remoting.SayService"/>
>
> - <camel:export id="say" uri="direct:sayImpl" serviceRef="sayService"
> -
> serviceInterface="org.apache.camel.spring.remoting.ISay"/>
> - <!-- END SNIPPET: export -->
> -
> <!-- START SNIPPET: example -->
> <camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
> + <!-- START SNIPPET: proxy -->
> + <!-- Creates a proxy to the direct:say endpoint. -->
> + <camel:proxy id="sayProxy" serviceUrl="direct:say"
> +
> serviceInterface="org.apache.camel.spring.remoting.ISay"/>
> + <!-- END SNIPPET: proxy -->
> + <!-- START SNIPPET: export -->
> + <camel:export id="say" uri="direct:sayImpl" serviceRef="sayService"
> +
> serviceInterface="org.apache.camel.spring.remoting.ISay"/>
> + <!--
> + The bean is defined out side of the camel
> + <bean id="sayService"
> class="org.apache.camel.spring.remoting.SayService"/>
> + -->
> + <!-- END SNIPPET: export -->
> <route>
> <from uri="direct:say"/>
> <to uri="direct:sayImpl"/>
>
>
>
--
Claus Ibsen
Apache Camel Committer
Open Source Integration: http://fusesource.com
Blog: http://davsclaus.blogspot.com/
Twitter: http://twitter.com/davsclaus