You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by js...@apache.org on 2007/08/13 10:46:59 UTC
svn commit: r565270 - in /activemq/camel/trunk: camel-core/
camel-core/src/main/java/org/apache/camel/
camel-core/src/main/java/org/apache/camel/impl/
camel-core/src/main/java/org/apache/camel/management/
components/camel-spring/src/main/java/org/apach...
Author: jstrachan
Date: Mon Aug 13 01:46:57 2007
New Revision: 565270
URL: http://svn.apache.org/viewvc?view=rev&rev=565270
Log:
patch applied from Hadrian Zbarcea for CAMEL-4 with thanks!
Added:
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/InstrumentationAgent.java (with props)
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/LifecycleStrategy.java (with props)
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultLifecycleStrategy.java (with props)
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/management/
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/management/CamelNamingStrategy.java (with props)
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/management/InstrumentationAgentImpl.java (with props)
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/management/InstrumentationLifecycleStrategy.java (with props)
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/management/ManagedEndpoint.java (with props)
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/management/ManagedRoute.java (with props)
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/management/ManagedService.java (with props)
activemq/camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/SpringInstrumentationAgent.java (with props)
activemq/camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/managment/
activemq/camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/managment/JmxInstrumentationWithConnectorTest.java (with props)
activemq/camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/management/
activemq/camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/management/jmxInstrumentationWithConnector.xml (with props)
Modified:
activemq/camel/trunk/camel-core/pom.xml
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/CamelContext.java
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/ServiceSupport.java
activemq/camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/CamelContextFactoryBean.java
Modified: activemq/camel/trunk/camel-core/pom.xml
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/pom.xml?view=diff&rev=565270&r1=565269&r2=565270
==============================================================================
--- activemq/camel/trunk/camel-core/pom.xml (original)
+++ activemq/camel/trunk/camel-core/pom.xml Mon Aug 13 01:46:57 2007
@@ -42,6 +42,14 @@
<artifactId>jaxb-api</artifactId>
</dependency>
+ <!-- to allow Spring annotations to be used; could replace with the micro-jar later -->
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring</artifactId>
+ <optional>true</optional>
+ <scope>compile</scope>
+ </dependency>
+
<!-- testing -->
<dependency>
<groupId>com.sun.xml.bind</groupId>
Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/CamelContext.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/CamelContext.java?view=diff&rev=565270&r1=565269&r2=565270
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/CamelContext.java (original)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/CamelContext.java Mon Aug 13 01:46:57 2007
@@ -173,6 +173,11 @@
Injector getInjector();
/**
+ * Returns the lifecycle strategy used to handle lifecycle notification
+ */
+ LifecycleStrategy getLifecycleStrategy();
+
+ /**
* Resolves a language for creating expressions
*/
Language resolveLanguage(String language);
Added: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/InstrumentationAgent.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/InstrumentationAgent.java?view=auto&rev=565270
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/InstrumentationAgent.java (added)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/InstrumentationAgent.java Mon Aug 13 01:46:57 2007
@@ -0,0 +1,59 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel;
+
+import javax.management.JMException;
+import javax.management.MBeanServer;
+import javax.management.ObjectName;
+
+public interface InstrumentationAgent {
+
+ /**
+ * Registers object with management infrastructure with a specific name. Object must be annotated or
+ * implement standard MBean interface.
+ * @param obj
+ * @param name
+ * @throws JMException
+ */
+ void register(Object obj, ObjectName name) throws JMException;
+
+ /**
+ * Registers object with management infrastructure with a specific name. Object must be annotated or
+ * implement standard MBean interface.
+ * @param obj
+ * @param name
+ * @param forceRegistration if set to true, then component will be registered despite existing component.
+ * @throws JMException
+ */
+ void register(Object obj, ObjectName name, boolean forceRegistration) throws JMException;
+
+ /**
+ * Unregisters component based upon registered name
+ * @param name
+ * @throws JMException
+ */
+ void unregister(ObjectName name) throws JMException;
+
+ /**
+ * Get the MBeanServer which hosts managed components
+ * NOTE: if the configuration is not set the JMXEnabled to be true, this method
+ * will return null
+ * @return the MBeanServer
+ */
+ MBeanServer getMBeanServer();
+
+}
Propchange: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/InstrumentationAgent.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/LifecycleStrategy.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/LifecycleStrategy.java?view=auto&rev=565270
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/LifecycleStrategy.java (added)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/LifecycleStrategy.java Mon Aug 13 01:46:57 2007
@@ -0,0 +1,42 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel;
+
+import java.util.Collection;
+
+public interface LifecycleStrategy {
+
+ /**
+ * Notification on adding a {@see CamelContext}.
+ */
+ void onContextCreate(CamelContext context);
+
+ /**
+ * Notification on adding an {@see Endpoint}.
+ */
+ void onEndpointAdd(Endpoint endpoint);
+
+ /**
+ * Notification on adding a {@see Route}.
+ */
+ void onServiceAdd(CamelContext context, Service service);
+
+ /**
+ * Notification on adding {@see Route}(s).
+ */
+ void onRoutesAdd(Collection<Route> routes);
+}
Propchange: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/LifecycleStrategy.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java?view=diff&rev=565270&r1=565269&r2=565270
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java (original)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java Mon Aug 13 01:46:57 2007
@@ -30,6 +30,7 @@
import org.apache.camel.Component;
import org.apache.camel.Endpoint;
import org.apache.camel.Exchange;
+import org.apache.camel.LifecycleStrategy;
import org.apache.camel.Processor;
import org.apache.camel.ResolveEndpointFailedException;
import org.apache.camel.Route;
@@ -69,6 +70,7 @@
private boolean autoCreateComponents = true;
private LanguageResolver languageResolver = new DefaultLanguageResolver();
private Registry registry;
+ private LifecycleStrategy lifecycleStrategy = new DefaultLifecycleStrategy();
public DefaultCamelContext() {
}
@@ -241,10 +243,9 @@
// If it's a singleton then auto register it.
if (answer != null && answer.isSingleton()) {
- if (answer != null) {
- startServices(answer);
- endpoints.put(uri, answer);
- }
+ startServices(answer);
+ endpoints.put(uri, answer);
+ lifecycleStrategy.onEndpointAdd(answer);
}
} catch (Exception e) {
throw new ResolveEndpointFailedException(uri, e);
@@ -280,6 +281,7 @@
} else {
this.routes.addAll(routes);
}
+ lifecycleStrategy.onRoutesAdd(routes);
if (isStarted()) {
startRoutes(routes);
}
@@ -372,6 +374,14 @@
public void setRegistry(Registry registry) {
this.registry = registry;
+ }
+
+ public LifecycleStrategy getLifecycleStrategy() {
+ return lifecycleStrategy;
+ }
+
+ public void setLifecycleStrategy(LifecycleStrategy lifecycleStrategy) {
+ this.lifecycleStrategy = lifecycleStrategy;
}
// Implementation methods
Added: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultLifecycleStrategy.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultLifecycleStrategy.java?view=auto&rev=565270
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultLifecycleStrategy.java (added)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultLifecycleStrategy.java Mon Aug 13 01:46:57 2007
@@ -0,0 +1,44 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.impl;
+
+import java.util.Collection;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.Endpoint;
+import org.apache.camel.LifecycleStrategy;
+import org.apache.camel.Route;
+import org.apache.camel.Service;
+
+public class DefaultLifecycleStrategy implements LifecycleStrategy {
+
+ public void onContextCreate(CamelContext context) {
+ // do nothing
+ }
+
+ public void onEndpointAdd(Endpoint endpoint) {
+ // do nothing
+ }
+
+ public void onServiceAdd(CamelContext context, Service service) {
+ // do nothing
+ }
+
+ public void onRoutesAdd(Collection<Route> routes) {
+ // do nothing
+ }
+}
Propchange: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultLifecycleStrategy.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/ServiceSupport.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/ServiceSupport.java?view=diff&rev=565270&r1=565269&r2=565270
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/ServiceSupport.java (original)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/ServiceSupport.java Mon Aug 13 01:46:57 2007
@@ -23,6 +23,10 @@
import java.util.Collection;
import java.util.concurrent.atomic.AtomicBoolean;
+import org.springframework.jmx.export.annotation.ManagedAttribute;
+import org.springframework.jmx.export.annotation.ManagedOperation;
+import org.springframework.jmx.export.annotation.ManagedResource;
+
/**
* A useful base class which ensures that a service is only initialized once and
* provides some helper methods for enquiring of its status
Added: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/management/CamelNamingStrategy.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/management/CamelNamingStrategy.java?view=auto&rev=565270
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/management/CamelNamingStrategy.java (added)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/management/CamelNamingStrategy.java Mon Aug 13 01:46:57 2007
@@ -0,0 +1,142 @@
+/**
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.management;
+
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.Hashtable;
+
+import javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.Endpoint;
+
+public class CamelNamingStrategy {
+
+ public static final String VALUE_UNKNOWN = "unknown";
+ public static final String KEY_CONTEXT = "context";
+ public static final String KEY_ENDPOINT = "endpoint";
+ public static final String KEY_ROUTE = "route";
+ public static final String KEY_TYPE = "type";
+ public static final String KEY_NAME = "name";
+ public static final String TYPE_ENDPOINTS = "Endpoints";
+ public static final String TYPE_SERVICES = "Services";
+ public static final String TYPE_ROUTES = "Routes";
+
+ protected String domainName = "org.apache.camel";
+ protected String hostName = "locahost";
+
+ public CamelNamingStrategy(String domainName) {
+ if (domainName != null) {
+ this.domainName = domainName;
+ }
+ try {
+ hostName = InetAddress.getLocalHost().getHostName();
+ }
+ catch (UnknownHostException ex) {
+ // ignore
+ }
+ }
+
+ /**
+ * Implements the naming strategy for a {@see CamelContext}.
+ * The convention used for a {@see CamelContext} ObjectName is
+ * "<domain>:context=<context>,name=camel".
+ *
+ * @param mbean
+ * @return generated ObjectName
+ * @throws MalformedObjectNameException
+ */
+ public ObjectName getObjectName(CamelContext context) throws MalformedObjectNameException {
+ Hashtable<String, String> keys = new Hashtable<String, String>();
+ keys.put(KEY_CONTEXT, getContextId(context));
+ keys.put(KEY_NAME, "camel");
+ return new ObjectName(domainName, keys);
+ }
+
+ /**
+ * Implements the naming strategy for a {@see ManagedEndpoint}.
+ * The convention used for a {@see ManagedEndpoint} ObjectName is
+ * "<domain>:context=<context>,type=Endpoints,endpoint=[urlPrefix]localPart".
+ *
+ * @param mbean
+ * @return generated ObjectName
+ * @throws MalformedObjectNameException
+ */
+ public ObjectName getObjectName(ManagedEndpoint mbean) throws MalformedObjectNameException {
+ Endpoint ep = mbean.getEndpoint();
+ Hashtable<String, String> keys = new Hashtable<String, String>();
+ keys.put(KEY_CONTEXT, getContextId(ep.getContext()));
+ keys.put(KEY_TYPE, TYPE_ENDPOINTS);
+ keys.put(KEY_ENDPOINT, getEndpointId(ep));
+ return new ObjectName(domainName, keys);
+ }
+
+ /**
+ * Implements the naming strategy for a {@see ServiceSpport Service}.
+ * The convention used for a {@see Service} ObjectName is
+ * "<domain>:context=<context>,type=Services,endpoint=[urlPrefix]localPart".
+ *
+ * @param mbean
+ * @return generated ObjectName
+ * @throws MalformedObjectNameException
+ */
+ public ObjectName getObjectName(CamelContext context, ManagedService mbean) throws MalformedObjectNameException {
+ Hashtable<String, String> keys = new Hashtable<String, String>();
+ keys.put(KEY_CONTEXT, getContextId(context));
+ keys.put(KEY_TYPE, TYPE_SERVICES);
+ keys.put(KEY_ENDPOINT, Integer.toHexString(mbean.getService().hashCode()));
+ return new ObjectName(domainName, keys);
+ }
+
+ /**
+ * Implements the naming strategy for a {@see ManagedRoute}.
+ * The convention used for a {@see ManagedEndpoint} ObjectName is
+ * "<domain>:context=<context>,type=Routes,endpoint=[urlPrefix]localPart".
+ *
+ * @param mbean
+ * @return generated ObjectName
+ * @throws MalformedObjectNameException
+ */
+ public ObjectName getObjectName(ManagedRoute mbean) throws MalformedObjectNameException {
+ Hashtable<String, String> keys = new Hashtable<String, String>();
+ Endpoint ep = mbean.getRoute().getEndpoint();
+ String ctxid = ep != null ? getContextId(ep.getContext()) : VALUE_UNKNOWN;
+ keys.put(KEY_CONTEXT, ctxid);
+ keys.put(KEY_TYPE, TYPE_ROUTES);
+ keys.put(KEY_ENDPOINT, getEndpointId(ep));
+ return new ObjectName(domainName, keys);
+ }
+
+ protected String getContextId(CamelContext context) {
+ String id = context != null ? Integer.toString(context.hashCode()) : VALUE_UNKNOWN;
+ return hostName + "/" + id;
+ }
+
+ protected String getEndpointId(Endpoint ep) {
+ String uri = ep.getEndpointUri();
+ int pos = uri.indexOf(':');
+ String id = (pos == -1) ? uri :
+ "[" + uri.substring(0, pos) + "]" + uri.substring(pos + 1);
+ if (!ep.isSingleton()) {
+ id += "." + Integer.toString(ep.hashCode());
+ }
+ return id;
+ }
+}
Propchange: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/management/CamelNamingStrategy.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/management/InstrumentationAgentImpl.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/management/InstrumentationAgentImpl.java?view=auto&rev=565270
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/management/InstrumentationAgentImpl.java (added)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/management/InstrumentationAgentImpl.java Mon Aug 13 01:46:57 2007
@@ -0,0 +1,138 @@
+/**
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.management;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.management.InstanceAlreadyExistsException;
+import javax.management.JMException;
+import javax.management.MBeanServer;
+import javax.management.NotCompliantMBeanException;
+import javax.management.ObjectInstance;
+import javax.management.ObjectName;
+import javax.management.modelmbean.InvalidTargetObjectTypeException;
+import javax.management.modelmbean.ModelMBeanInfo;
+import javax.management.modelmbean.RequiredModelMBean;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.CamelContextAware;
+import org.apache.camel.InstrumentationAgent;
+import org.apache.camel.impl.DefaultCamelContext;
+import org.springframework.jmx.export.annotation.AnnotationJmxAttributeSource;
+import org.springframework.jmx.export.assembler.MetadataMBeanInfoAssembler;
+
+public class InstrumentationAgentImpl implements InstrumentationAgent, CamelContextAware {
+
+ private MBeanServer server;
+ private CamelContext context;
+ private Set<ObjectName> mbeans = new HashSet<ObjectName>();
+ MetadataMBeanInfoAssembler assembler;
+
+ public InstrumentationAgentImpl() {
+ assembler = new MetadataMBeanInfoAssembler();
+ assembler.setAttributeSource(new AnnotationJmxAttributeSource());
+ }
+ public CamelContext getCamelContext() {
+ return context;
+ }
+
+ public void setCamelContext(CamelContext camelContext) {
+ context = camelContext;
+ }
+
+ public void setMBeanServer(MBeanServer server) {
+ this.server = server;
+ }
+
+ public MBeanServer getMBeanServer() {
+ return server;
+ }
+
+ public void register(Object obj, ObjectName name) throws JMException {
+ register(obj, name, false);
+ }
+
+ public void register(Object obj, ObjectName name, boolean forceRegistration) throws JMException {
+ try {
+ registerMBeanWithServer(obj, name, forceRegistration);
+ } catch (NotCompliantMBeanException e) {
+ //If this is not a "normal" MBean, then try to deploy it using JMX annotations
+ ModelMBeanInfo mbi = null;
+ mbi = assembler.getMBeanInfo(obj, name.toString());
+ RequiredModelMBean mbean = (RequiredModelMBean)server.instantiate(RequiredModelMBean.class.getName());
+ mbean.setModelMBeanInfo(mbi);
+ try {
+ mbean.setManagedResource(obj, "ObjectReference");
+ } catch (InvalidTargetObjectTypeException itotex) {
+ throw new JMException(itotex.getMessage());
+ }
+ registerMBeanWithServer(mbean, name, forceRegistration);
+ }
+ }
+
+ public void unregister(ObjectName name) throws JMException {
+ }
+
+ public void start() {
+ if (context == null) {
+ // LOG warning
+ return;
+ }
+
+ if (context instanceof DefaultCamelContext) {
+ DefaultCamelContext dc = (DefaultCamelContext)context;
+ InstrumentationLifecycleStrategy ls = new InstrumentationLifecycleStrategy(this);
+ dc.setLifecycleStrategy(ls);
+ ls.onContextCreate(context);
+ }
+ }
+
+ public void stop() {
+ //Using the array to hold the busMBeans to avoid the CurrentModificationException
+ Object[] mBeans = mbeans.toArray();
+ for (Object name : mBeans) {
+ mbeans.remove((ObjectName)name);
+ try {
+ unregister((ObjectName)name);
+ } catch (JMException jmex) {
+ // log
+ }
+ }
+ }
+
+ private void registerMBeanWithServer(Object obj, ObjectName name, boolean forceRegistration)
+ throws JMException {
+
+ ObjectInstance instance = null;
+ try {
+ instance = server.registerMBean(obj, name);
+ } catch (InstanceAlreadyExistsException e) {
+ if (forceRegistration) {
+ server.unregisterMBean(name);
+ instance = server.registerMBean(obj, name);
+ } else {
+ throw e;
+ }
+ }
+
+ if (instance != null) {
+ mbeans.add(name);
+ }
+ }
+}
Propchange: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/management/InstrumentationAgentImpl.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/management/InstrumentationLifecycleStrategy.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/management/InstrumentationLifecycleStrategy.java?view=auto&rev=565270
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/management/InstrumentationLifecycleStrategy.java (added)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/management/InstrumentationLifecycleStrategy.java Mon Aug 13 01:46:57 2007
@@ -0,0 +1,88 @@
+/**
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.management;
+
+import java.util.Collection;
+
+import javax.management.JMException;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.Endpoint;
+import org.apache.camel.InstrumentationAgent;
+import org.apache.camel.LifecycleStrategy;
+import org.apache.camel.Route;
+import org.apache.camel.Service;
+import org.apache.camel.impl.DefaultCamelContext;
+import org.apache.camel.impl.ServiceSupport;
+
+public class InstrumentationLifecycleStrategy implements LifecycleStrategy {
+ InstrumentationAgent agent;
+ CamelNamingStrategy naming;
+
+ public InstrumentationLifecycleStrategy(InstrumentationAgent agent) {
+ this.agent = agent;
+ naming = new CamelNamingStrategy(agent.getMBeanServer().getDefaultDomain());
+ }
+
+ public void onContextCreate(CamelContext context) {
+ if (context instanceof DefaultCamelContext) {
+ try {
+ DefaultCamelContext dc = (DefaultCamelContext)context;
+ ManagedService ms = new ManagedService(dc);
+ agent.register(ms, naming.getObjectName(dc));
+ }
+ catch(JMException e) {
+ // log a WARN
+ }
+ }
+ }
+
+ public void onEndpointAdd(Endpoint endpoint) {
+ try {
+ ManagedEndpoint me = new ManagedEndpoint(endpoint);
+ agent.register(me, naming.getObjectName(me));
+ }
+ catch(JMException e) {
+ // log a WARN
+ }
+ }
+
+ public void onRoutesAdd(Collection<Route> routes) {
+ for (Route route: routes) {
+ try {
+ ManagedRoute mr = new ManagedRoute(route);
+ agent.register(mr, naming.getObjectName(mr));
+ }
+ catch(JMException e) {
+ // log a WARN
+ }
+ }
+ }
+
+ public void onServiceAdd(CamelContext context, Service service) {
+ if (service instanceof ServiceSupport) {
+ try {
+ ManagedService ms = new ManagedService((ServiceSupport)service);
+ agent.register(ms, naming.getObjectName(context, ms));
+ }
+ catch(JMException e) {
+ // log a WARN
+ }
+ }
+ }
+}
Propchange: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/management/InstrumentationLifecycleStrategy.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/management/ManagedEndpoint.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/management/ManagedEndpoint.java?view=auto&rev=565270
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/management/ManagedEndpoint.java (added)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/management/ManagedEndpoint.java Mon Aug 13 01:46:57 2007
@@ -0,0 +1,43 @@
+/**
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.management;
+
+import org.apache.camel.Endpoint;
+import org.springframework.jmx.export.annotation.ManagedAttribute;
+import org.springframework.jmx.export.annotation.ManagedResource;
+
+@ManagedResource(
+ description="Managed Endpoint",
+ currencyTimeLimit=15)
+public class ManagedEndpoint {
+
+ private Endpoint endpoint;
+
+ public ManagedEndpoint(Endpoint endpoint) {
+ this.endpoint = endpoint;
+ }
+
+ public Endpoint getEndpoint() {
+ return endpoint;
+ }
+
+ @ManagedAttribute(description = "Endpoint Uri")
+ public String getUri() throws Exception {
+ return endpoint.getEndpointUri();
+ }
+}
Propchange: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/management/ManagedEndpoint.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/management/ManagedRoute.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/management/ManagedRoute.java?view=auto&rev=565270
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/management/ManagedRoute.java (added)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/management/ManagedRoute.java Mon Aug 13 01:46:57 2007
@@ -0,0 +1,59 @@
+/**
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.management;
+
+import java.io.IOException;
+
+import org.apache.camel.Endpoint;
+import org.apache.camel.Route;
+import org.springframework.jmx.export.annotation.ManagedAttribute;
+import org.springframework.jmx.export.annotation.ManagedOperation;
+import org.springframework.jmx.export.annotation.ManagedResource;
+
+@ManagedResource(
+ description="Managed Route",
+ currencyTimeLimit=15)
+public class ManagedRoute{
+
+ public static final String VALUE_UNKNOWN = "Unknown";
+ private Route route;
+
+ ManagedRoute(Route route) {
+ this.route = route;
+ }
+
+ public Route getRoute() {
+ return route;
+ }
+
+ @ManagedAttribute(description = "Route Endpoint Uri")
+ public String getEndpointUri() {
+ Endpoint ep = route.getEndpoint();
+ return ep != null ? ep.getEndpointUri() : VALUE_UNKNOWN;
+ }
+
+ @ManagedOperation(description = "Start Route")
+ public void start() throws IOException {
+ throw new IOException("Not supported");
+ }
+
+ @ManagedOperation(description = "Stop Route")
+ public void stop() throws IOException {
+ throw new IOException("Not supported");
+ }
+}
Propchange: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/management/ManagedRoute.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/management/ManagedService.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/management/ManagedService.java?view=auto&rev=565270
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/management/ManagedService.java (added)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/management/ManagedService.java Mon Aug 13 01:46:57 2007
@@ -0,0 +1,67 @@
+/**
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.management;
+
+import java.io.IOException;
+
+import org.apache.camel.Service;
+import org.apache.camel.impl.ServiceSupport;
+import org.springframework.jmx.export.annotation.ManagedAttribute;
+import org.springframework.jmx.export.annotation.ManagedOperation;
+import org.springframework.jmx.export.annotation.ManagedResource;
+
+@ManagedResource(
+ description="Managed Service",
+ currencyTimeLimit=15)
+public class ManagedService {
+
+ private ServiceSupport service;
+
+ public ManagedService(ServiceSupport service) {
+ this.service = service;
+ }
+
+ public Service getService() {
+ return service;
+ }
+
+ @ManagedAttribute(description = "Service running state")
+ private boolean isStarted() throws IOException {
+ return service.isStarted();
+ }
+
+ @ManagedOperation(description = "Start Service")
+ public void start() throws IOException {
+ try {
+ service.start();
+ }
+ catch (Exception e) {
+ throw new IOException(e.getMessage());
+ }
+ }
+
+ @ManagedOperation(description = "Stop Service")
+ public void stop() throws IOException {
+ try {
+ service.stop();
+ }
+ catch (Exception e) {
+ throw new IOException(e.getMessage());
+ }
+ }
+}
Propchange: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/management/ManagedService.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: activemq/camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/CamelContextFactoryBean.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/CamelContextFactoryBean.java?view=diff&rev=565270&r1=565269&r2=565270
==============================================================================
--- activemq/camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/CamelContextFactoryBean.java (original)
+++ activemq/camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/CamelContextFactoryBean.java Mon Aug 13 01:46:57 2007
@@ -91,7 +91,11 @@
getContext();
LOG.debug("Found JAXB created routes: " + getRoutes());
-
+ String[] names = applicationContext.getBeanNamesForType(SpringInstrumentationAgent.class);
+ if (names.length == 1) {
+ applicationContext.getBean(names[0], SpringInstrumentationAgent.class);
+ }
+
findRouteBuiders();
installRoutes();
}
Added: activemq/camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/SpringInstrumentationAgent.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/SpringInstrumentationAgent.java?view=auto&rev=565270
==============================================================================
--- activemq/camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/SpringInstrumentationAgent.java (added)
+++ activemq/camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/SpringInstrumentationAgent.java Mon Aug 13 01:46:57 2007
@@ -0,0 +1,33 @@
+/**
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.spring;
+
+import org.apache.camel.management.InstrumentationAgentImpl;
+import org.springframework.beans.factory.DisposableBean;
+import org.springframework.beans.factory.InitializingBean;
+
+public class SpringInstrumentationAgent extends InstrumentationAgentImpl
+ implements InitializingBean, DisposableBean {
+
+ public void afterPropertiesSet() throws Exception {
+ start();
+ }
+
+ public void destroy() throws Exception {
+ }
+}
Propchange: activemq/camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/SpringInstrumentationAgent.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: activemq/camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/managment/JmxInstrumentationWithConnectorTest.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/managment/JmxInstrumentationWithConnectorTest.java?view=auto&rev=565270
==============================================================================
--- activemq/camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/managment/JmxInstrumentationWithConnectorTest.java (added)
+++ activemq/camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/managment/JmxInstrumentationWithConnectorTest.java Mon Aug 13 01:46:57 2007
@@ -0,0 +1,37 @@
+/**
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.spring.managment;
+
+import org.apache.camel.InstrumentationAgent;
+import org.apache.camel.spring.EndpointReferenceTest;
+import org.apache.camel.spring.SpringInstrumentationAgent;
+import org.springframework.context.support.ClassPathXmlApplicationContext;
+
+public class JmxInstrumentationWithConnectorTest extends EndpointReferenceTest {
+
+ public void testJmxConfiguration() throws Exception {
+ InstrumentationAgent agent = getMandatoryBean(SpringInstrumentationAgent.class, "agent");
+ assertNotNull("SpringInstrumentationAgent must be configured for JMX support", agent);
+ assertNotNull("MBeanServer must be configured for JMX support", agent.getMBeanServer());
+ }
+
+ @Override
+ protected ClassPathXmlApplicationContext createApplicationContext() {
+ return new ClassPathXmlApplicationContext("org/apache/camel/spring/management/jmxInstrumentationWithConnector.xml");
+ }
+}
Propchange: activemq/camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/managment/JmxInstrumentationWithConnectorTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: activemq/camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/management/jmxInstrumentationWithConnector.xml
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/management/jmxInstrumentationWithConnector.xml?view=auto&rev=565270
==============================================================================
--- activemq/camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/management/jmxInstrumentationWithConnector.xml (added)
+++ activemq/camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/management/jmxInstrumentationWithConnector.xml Mon Aug 13 01:46:57 2007
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<beans xmlns="http://www.springframework.org/schema/beans"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="
+ http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
+ http://activemq.apache.org/camel/schema/spring http://activemq.apache.org/camel/schema/spring/camel-spring.xsd
+ ">
+
+ <!-- START SNIPPET: example -->
+ <bean id="mybean" class="org.apache.camel.spring.example.DummyBean">
+ <property name="endpoint" ref="endpoint1"/>
+ </bean>
+ <camelContext id="camel" xmlns="http://activemq.apache.org/camel/schema/spring">
+ <beanPostProcessor/>
+ <endpoint id="endpoint1" uri="direct:start"/>
+ <endpoint id="endpoint2" uri="mock:end"/>
+
+ <route>
+ <from ref="endpoint1"/>
+ <to ref="endpoint2"/>
+ </route>
+ </camelContext>
+
+ <bean id="agent" class="org.apache.camel.spring.SpringInstrumentationAgent">
+ <property name="camelContext" ref="camel"/>
+ <property name="MBeanServer" ref="mbeanServer"/>
+ </bean>
+ <!--
+ this bean needs to be eagerly pre-instantiated in order for the exporting to occur;
+ this means that it must not be marked as lazily initialized
+ -->
+ <bean id="mbeanServer" class="org.springframework.jmx.support.MBeanServerFactoryBean">
+ <property name="defaultDomain" value="org.apache.camel.test"/>
+ </bean>
+ <bean id="registry" class="org.springframework.remoting.rmi.RmiRegistryFactoryBean">
+ <property name="port" value="1099"/>
+ </bean>
+ <bean id="serverConnector"
+ class="org.springframework.jmx.support.ConnectorServerFactoryBean" depends-on="registry">
+ <property name="objectName" value="connector:name=rmi"/>
+ <property name="serviceUrl"
+ value="service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi"/>
+ <property name="threaded" value="true"/>
+ <property name="daemon" value="true"/>
+ </bean>
+ <!-- END SNIPPET: example -->
+
+</beans>
Propchange: activemq/camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/management/jmxInstrumentationWithConnector.xml
------------------------------------------------------------------------------
svn:eol-style = native