Author: davsclaus Date: Tue Aug 2 15:10:24 2011 New Revision: 1153158 URL: http://svn.apache.org/viewvc?rev=1153158&view=rev Log: CAMEL-4249: Camel now check if managed object has Spring JMX annotations and use those, if not it fallback and use the default from camel-core.
Added: camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/management/SpringManagedCustomProcessorTest.java - copied, changed from r1153091, camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/management/SpringJmxEndpointInjectBeanTest.java camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/management/SpringManagedCustomProcessorTest.xml - copied, changed from r1153091, camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/management/SpringJmxRecipientListTest.xml Modified: camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/spi/SpringManagementMBeanAssembler.java Modified: camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/spi/SpringManagementMBeanAssembler.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/spi/SpringManagementMBeanAssembler.java?rev=1153158&r1=1153157&r2=1153158&view=diff ============================================================================== --- camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/spi/SpringManagementMBeanAssembler.java (original) +++ camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/spi/SpringManagementMBeanAssembler.java Tue Aug 2 15:10:24 2011 @@ -48,12 +48,6 @@ public class SpringManagementMBeanAssemb } public ModelMBean assemble(MBeanServer mBeanServer, Object obj, ObjectName name) throws JMException { - // try the default first, and if it could assemble the object, then use that as is - ModelMBean mbean = super.assemble(mBeanServer, obj, name); - if (mbean != null) { - return mbean; - } - ModelMBeanInfo mbi = null; // prefer to use the managed instance if it has been annotated with Spring JMX annotations @@ -69,12 +63,19 @@ public class SpringManagementMBeanAssemb } if (mbi == null) { - // use the default provided mbean which has been annotated with Spring JMX annotations - log.trace("Assembling MBeanInfo for: {} from @ManagedResource object: {}", name, obj); - mbi = assembler.getMBeanInfo(obj, name.toString()); + if (ObjectHelper.hasAnnotation(obj.getClass().getAnnotations(), ManagedResource.class)) { + // the object has a Spring ManagedResource annotations so assemble the MBeanInfo + log.trace("Assembling MBeanInfo for: {} from @ManagedResource object: {}", name, obj); + mbi = assembler.getMBeanInfo(obj, name.toString()); + } else { + // fallback and let the default mbean assembler handle this instead + return super.assemble(mBeanServer, obj, name); + } } - mbean = (RequiredModelMBean) mBeanServer.instantiate(RequiredModelMBean.class.getName()); + log.trace("Assembled MBeanInfo {}", mbi); + + ModelMBean mbean = (RequiredModelMBean) mBeanServer.instantiate(RequiredModelMBean.class.getName()); mbean.setModelMBeanInfo(mbi); try { Copied: camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/management/SpringManagedCustomProcessorTest.java (from r1153091, camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/management/SpringJmxEndpointInjectBeanTest.java) URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/management/SpringManagedCustomProcessorTest.java?p2=camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/management/SpringManagedCustomProcessorTest.java&p1=camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/management/SpringJmxEndpointInjectBeanTest.java&r1=1153091&r2=1153158&rev=1153158&view=diff ============================================================================== --- camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/management/SpringJmxEndpointInjectBeanTest.java (original) +++ camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/management/SpringManagedCustomProcessorTest.java Tue Aug 2 15:10:24 2011 @@ -16,41 +16,72 @@ */ package org.apache.camel.spring.management; +import javax.management.Attribute; import javax.management.MBeanServer; import javax.management.ObjectName; +import org.apache.camel.Exchange; +import org.apache.camel.Processor; import org.apache.camel.spring.SpringTestSupport; import org.springframework.context.support.AbstractXmlApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; +import org.springframework.jmx.export.annotation.ManagedAttribute; +import org.springframework.jmx.export.annotation.ManagedResource; /** * @version */ -public class SpringJmxEndpointInjectBeanTest extends SpringTestSupport { +public class SpringManagedCustomProcessorTest extends SpringTestSupport { @Override protected AbstractXmlApplicationContext createApplicationContext() { - return new ClassPathXmlApplicationContext("org/apache/camel/spring/management/SpringJmxEndpointInjectBeanTest.xml"); + return new ClassPathXmlApplicationContext("org/apache/camel/spring/management/SpringManagedCustomProcessorTest.xml"); } protected MBeanServer getMBeanServer() { return context.getManagementStrategy().getManagementAgent().getMBeanServer(); } - public void testJmxEndpointInjectBean() throws Exception { + public void testManageCustomProcessor() throws Exception { MBeanServer mbeanServer = getMBeanServer(); + ObjectName on = ObjectName.getInstance("org.apache.camel:context=localhost/camel-1,type=processors,name=\"custom\""); - ObjectName on = ObjectName.getInstance("org.apache.camel:context=localhost/camel-1,type=components,name=\"seda\""); - assertTrue(mbeanServer.isRegistered(on)); + getMockEndpoint("mock:result").expectedMessageCount(1); + getMockEndpoint("mock:result").expectedHeaderReceived("foo", "hey"); + template.sendBody("direct:start", "Hello World"); + assertMockEndpointsSatisfied(); - on = ObjectName.getInstance("org.apache.camel:context=localhost/camel-1,type=endpoints,name=\"seda://foo\""); - assertTrue(mbeanServer.isRegistered(on)); - String uri = (String) mbeanServer.getAttribute(on, "EndpointUri"); - assertEquals("seda://foo", uri); + String foo = (String) mbeanServer.getAttribute(on, "Foo"); + assertEquals("hey", foo); - getMockEndpoint("mock:result").expectedBodiesReceived("Hello World"); - template.sendBody("direct:start", "Hello World"); + // change foo + mbeanServer.setAttribute(on, new Attribute("Foo", "changed")); + + resetMocks(); + + getMockEndpoint("mock:result").expectedMessageCount(1); + getMockEndpoint("mock:result").expectedHeaderReceived("foo", "changed"); + template.sendBody("direct:start", "Bye World"); assertMockEndpointsSatisfied(); } + @ManagedResource(description = "My Managed Component") + public static class MyCustomProcessor implements Processor { + private String foo = "hey"; + + @ManagedAttribute(description = "Foo is the foo") + public String getFoo() { + return foo; + } + + @ManagedAttribute(description = "Foo is the foo") + public void setFoo(String foo) { + this.foo = foo; + } + + public void process(Exchange exchange) throws Exception { + exchange.getIn().setHeader("foo", getFoo()); + } + } + } Copied: camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/management/SpringManagedCustomProcessorTest.xml (from r1153091, camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/management/SpringJmxRecipientListTest.xml) URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/management/SpringManagedCustomProcessorTest.xml?p2=camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/management/SpringManagedCustomProcessorTest.xml&p1=camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/management/SpringJmxRecipientListTest.xml&r1=1153091&r2=1153158&rev=1153158&view=diff ============================================================================== --- camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/management/SpringJmxRecipientListTest.xml (original) +++ camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/management/SpringManagedCustomProcessorTest.xml Tue Aug 2 15:10:24 2011 @@ -22,26 +22,22 @@ http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd "> - <bean id="naming" class="org.apache.camel.management.DefaultManagementNamingStrategy"> - <property name="hostName" value="localhost"/> - <property name="domainName" value="org.apache.camel"/> - </bean> + <bean id="myProcessor" class="org.apache.camel.spring.management.SpringManagedCustomProcessorTest$MyCustomProcessor"/> - <!-- START SNIPPET: e1 --> - <camelContext xmlns="http://camel.apache.org/schema/spring"> - <!-- enable JMX --> - <jmxAgent id="agent" disabled="false"/> + <bean id="naming" class="org.apache.camel.management.DefaultManagementNamingStrategy"> + <property name="hostName" value="localhost"/> + <property name="domainName" value="org.apache.camel"/> + </bean> - <route> - <from uri="direct:a"/> - <!-- this is a dynamic EIP so we may register mbeans after the route has started - such as new endpoints, and its associated producers. Camel does NOT do this - by default, you would have to enable that on the jmxAgent if you want this. --> - <recipientList> - <header>recipientListHeader</header> - </recipientList> - </route> - </camelContext> - <!-- END SNIPPET: e1 --> + <camelContext xmlns="http://camel.apache.org/schema/spring"> + <!-- enable JMX --> + <jmxAgent id="agent" disabled="false"/> + + <route> + <from uri="direct:start"/> + <process ref="myProcessor" id="custom"/> + <to uri="mock:result"/> + </route> + </camelContext> </beans>