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 &lt;camelContext&gt; 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

Reply via email to