CAMEL-11806: cluster service : add JMX support

Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/06aa9737
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/06aa9737
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/06aa9737

Branch: refs/heads/master
Commit: 06aa9737720beb3cc3015e758e93bc3f8dccc8f7
Parents: 96a7cfd
Author: lburgazzoli <lburgazz...@gmail.com>
Authored: Fri Sep 22 19:00:49 2017 +0200
Committer: lburgazzoli <lburgazz...@gmail.com>
Committed: Mon Sep 25 14:21:00 2017 +0200

----------------------------------------------------------------------
 .../mbean/ManagedClusterServiceMBean.java       |  45 ++++++++
 .../DefaultManagementLifecycleStrategy.java     |   3 +
 .../DefaultManagementNamingStrategy.java        |  14 +++
 .../DefaultManagementObjectStrategy.java        |   8 ++
 .../management/ManagedManagementStrategy.java   |   4 +
 .../management/mbean/ManagedClusterService.java | 107 +++++++++++++++++++
 .../camel/spi/ManagementNamingStrategy.java     |   3 +
 .../camel/spi/ManagementObjectStrategy.java     |   3 +
 8 files changed, 187 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/06aa9737/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedClusterServiceMBean.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedClusterServiceMBean.java
 
b/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedClusterServiceMBean.java
new file mode 100644
index 0000000..81ec33a
--- /dev/null
+++ 
b/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedClusterServiceMBean.java
@@ -0,0 +1,45 @@
+/**
+ * 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.api.management.mbean;
+
+import java.util.Collection;
+
+import org.apache.camel.api.management.ManagedAttribute;
+import org.apache.camel.api.management.ManagedOperation;
+
+public interface ManagedClusterServiceMBean {
+    @ManagedAttribute(description = "The namespaces handled by the service")
+    Collection<String> getNamespaces();
+
+    @ManagedAttribute(description = "Service State")
+    String getState();
+
+    @ManagedAttribute(description = "Camel ID")
+    String getCamelId();
+
+    @ManagedOperation(description = "Start Service")
+    void start() throws Exception;
+
+    @ManagedOperation(description = "Stop Service")
+    void stop() throws Exception;
+
+    @ManagedOperation(description = "Start the View")
+    void startView(String namespace) throws Exception;
+
+    @ManagedOperation(description = "Stop the View")
+    void stopView(String namespace) throws Exception;
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/camel/blob/06aa9737/camel-core/src/main/java/org/apache/camel/management/DefaultManagementLifecycleStrategy.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/main/java/org/apache/camel/management/DefaultManagementLifecycleStrategy.java
 
b/camel-core/src/main/java/org/apache/camel/management/DefaultManagementLifecycleStrategy.java
index 2631bb1..63ea20b 100644
--- 
a/camel-core/src/main/java/org/apache/camel/management/DefaultManagementLifecycleStrategy.java
+++ 
b/camel-core/src/main/java/org/apache/camel/management/DefaultManagementLifecycleStrategy.java
@@ -46,6 +46,7 @@ import org.apache.camel.StartupListener;
 import org.apache.camel.TimerListener;
 import org.apache.camel.VetoCamelContextStartException;
 import org.apache.camel.api.management.PerformanceCounter;
+import org.apache.camel.ha.CamelClusterService;
 import org.apache.camel.impl.ConsumerCache;
 import org.apache.camel.impl.DefaultCamelContext;
 import org.apache.camel.impl.DefaultEndpointRegistry;
@@ -546,6 +547,8 @@ public class DefaultManagementLifecycleStrategy extends 
ServiceSupport implement
             answer = new ManagedValidatorRegistry(context, 
(ValidatorRegistry)service);
         } else if (service instanceof RuntimeCamelCatalog) {
             answer = new ManagedRuntimeCamelCatalog(context, 
(RuntimeCamelCatalog) service);
+        } else if (service instanceof CamelClusterService) {
+            answer = 
getManagementObjectStrategy().getManagedObjectForClusterService(context, 
(CamelClusterService)service);
         } else if (service != null) {
             // fallback as generic service
             answer = 
getManagementObjectStrategy().getManagedObjectForService(context, service);

http://git-wip-us.apache.org/repos/asf/camel/blob/06aa9737/camel-core/src/main/java/org/apache/camel/management/DefaultManagementNamingStrategy.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/main/java/org/apache/camel/management/DefaultManagementNamingStrategy.java
 
b/camel-core/src/main/java/org/apache/camel/management/DefaultManagementNamingStrategy.java
index 388f6d6..169fd6f 100644
--- 
a/camel-core/src/main/java/org/apache/camel/management/DefaultManagementNamingStrategy.java
+++ 
b/camel-core/src/main/java/org/apache/camel/management/DefaultManagementNamingStrategy.java
@@ -34,6 +34,7 @@ import org.apache.camel.Route;
 import org.apache.camel.Service;
 import org.apache.camel.StaticService;
 import org.apache.camel.builder.ErrorHandlerBuilderRef;
+import org.apache.camel.ha.CamelClusterService;
 import org.apache.camel.spi.DataFormat;
 import org.apache.camel.spi.EventNotifier;
 import org.apache.camel.spi.InterceptStrategy;
@@ -66,6 +67,7 @@ public class DefaultManagementNamingStrategy implements 
ManagementNamingStrategy
     public static final String TYPE_ERRORHANDLER = "errorhandlers";
     public static final String TYPE_THREAD_POOL = "threadpools";
     public static final String TYPE_SERVICE = "services";
+    public static final String TYPE_HA = "ha";
 
     protected String domainName;
     protected String hostName = "localhost";
@@ -321,6 +323,18 @@ public class DefaultManagementNamingStrategy implements 
ManagementNamingStrategy
         return createObjectName(buffer);
     }
 
+    public ObjectName getObjectNameForClusterService(CamelContext context, 
CamelClusterService service) throws MalformedObjectNameException {
+        StringBuilder buffer = new StringBuilder();
+        buffer.append(domainName).append(":");
+        buffer.append(KEY_CONTEXT + 
"=").append(getContextId(context)).append(",");
+        buffer.append(KEY_TYPE + "=" + TYPE_HA + ",");
+        buffer.append(KEY_NAME + 
"=").append(service.getClass().getSimpleName());
+        if (!(service instanceof StaticService)) {
+            
buffer.append("(").append(ObjectHelper.getIdentityHashCode(service)).append(")");
+        }
+        return createObjectName(buffer);
+    }
+
     public ObjectName getObjectNameForThreadPool(CamelContext context, 
ThreadPoolExecutor threadPool, String id, String sourceId) throws 
MalformedObjectNameException {
         StringBuilder buffer = new StringBuilder();
         buffer.append(domainName).append(":");

http://git-wip-us.apache.org/repos/asf/camel/blob/06aa9737/camel-core/src/main/java/org/apache/camel/management/DefaultManagementObjectStrategy.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/main/java/org/apache/camel/management/DefaultManagementObjectStrategy.java
 
b/camel-core/src/main/java/org/apache/camel/management/DefaultManagementObjectStrategy.java
index a7f6e34..6175134 100644
--- 
a/camel-core/src/main/java/org/apache/camel/management/DefaultManagementObjectStrategy.java
+++ 
b/camel-core/src/main/java/org/apache/camel/management/DefaultManagementObjectStrategy.java
@@ -31,6 +31,7 @@ import org.apache.camel.Route;
 import org.apache.camel.Service;
 import org.apache.camel.component.bean.BeanProcessor;
 import org.apache.camel.component.log.LogEndpoint;
+import org.apache.camel.ha.CamelClusterService;
 import org.apache.camel.impl.ScheduledPollConsumer;
 import org.apache.camel.management.mbean.ManagedAggregateProcessor;
 import org.apache.camel.management.mbean.ManagedBeanProcessor;
@@ -39,6 +40,7 @@ import org.apache.camel.management.mbean.ManagedCamelContext;
 import org.apache.camel.management.mbean.ManagedCamelHealth;
 import org.apache.camel.management.mbean.ManagedChoice;
 import org.apache.camel.management.mbean.ManagedCircuitBreakerLoadBalancer;
+import org.apache.camel.management.mbean.ManagedClusterService;
 import org.apache.camel.management.mbean.ManagedComponent;
 import org.apache.camel.management.mbean.ManagedConsumer;
 import org.apache.camel.management.mbean.ManagedConvertBody;
@@ -281,6 +283,12 @@ public class DefaultManagementObjectStrategy implements 
ManagementObjectStrategy
         return mc;
     }
 
+    public Object getManagedObjectForClusterService(CamelContext context, 
CamelClusterService service) {
+        ManagedClusterService mcs = new ManagedClusterService(context, 
service);
+        mcs.init(context.getManagementStrategy());
+        return mcs;
+    }
+
     @SuppressWarnings({"deprecation", "unchecked"})
     public Object getManagedObjectForProcessor(CamelContext context, Processor 
processor,
                                                ProcessorDefinition<?> 
definition, Route route) {

http://git-wip-us.apache.org/repos/asf/camel/blob/06aa9737/camel-core/src/main/java/org/apache/camel/management/ManagedManagementStrategy.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/main/java/org/apache/camel/management/ManagedManagementStrategy.java
 
b/camel-core/src/main/java/org/apache/camel/management/ManagedManagementStrategy.java
index fcb16a2..82f6760 100644
--- 
a/camel-core/src/main/java/org/apache/camel/management/ManagedManagementStrategy.java
+++ 
b/camel-core/src/main/java/org/apache/camel/management/ManagedManagementStrategy.java
@@ -24,6 +24,7 @@ import 
org.apache.camel.management.mbean.ManagedBacklogDebugger;
 import org.apache.camel.management.mbean.ManagedBacklogTracer;
 import org.apache.camel.management.mbean.ManagedCamelContext;
 import org.apache.camel.management.mbean.ManagedCamelHealth;
+import org.apache.camel.management.mbean.ManagedClusterService;
 import org.apache.camel.management.mbean.ManagedComponent;
 import org.apache.camel.management.mbean.ManagedConsumer;
 import org.apache.camel.management.mbean.ManagedDataFormat;
@@ -140,6 +141,9 @@ public class ManagedManagementStrategy extends 
DefaultManagementStrategy {
         } else if (managedObject instanceof ManagedThreadPool) {
             ManagedThreadPool mes = (ManagedThreadPool) managedObject;
             objectName = 
getManagementNamingStrategy().getObjectNameForThreadPool(mes.getContext(), 
mes.getThreadPool(), mes.getId(), mes.getSourceId());
+        } else if (managedObject instanceof ManagedClusterService) {
+            ManagedClusterService mcs = (ManagedClusterService) managedObject;
+            objectName = 
getManagementNamingStrategy().getObjectNameForClusterService(mcs.getContext(), 
mcs.getService());
         } else if (managedObject instanceof ManagedService) {
             // check for managed service should be last
             ManagedService ms = (ManagedService) managedObject;

http://git-wip-us.apache.org/repos/asf/camel/blob/06aa9737/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedClusterService.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedClusterService.java
 
b/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedClusterService.java
new file mode 100644
index 0000000..3261b69
--- /dev/null
+++ 
b/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedClusterService.java
@@ -0,0 +1,107 @@
+/**
+ * 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.mbean;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Optional;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.ServiceStatus;
+import org.apache.camel.StatefulService;
+import org.apache.camel.api.management.mbean.ManagedClusterServiceMBean;
+import org.apache.camel.ha.CamelClusterService;
+import org.apache.camel.ha.CamelClusterServiceHelper;
+import org.apache.camel.spi.ManagementStrategy;
+
+public class ManagedClusterService implements ManagedClusterServiceMBean {
+    private final CamelContext context;
+    private final CamelClusterService service;
+
+    public ManagedClusterService(CamelContext context, CamelClusterService 
service) {
+        this.context = context;
+        this.service = service;
+    }
+
+    public void init(ManagementStrategy strategy) {
+        // do nothing
+    }
+
+    public CamelContext getContext() {
+        return context;
+    }
+
+    public CamelClusterService getService() {
+        return service;
+    }
+
+    @Override
+    public void start() throws Exception {
+        if (!context.getStatus().isStarted()) {
+            throw new IllegalArgumentException("CamelContext is not started");
+        }
+        service.start();
+    }
+
+    @Override
+    public void stop() throws Exception {
+        if (!context.getStatus().isStarted()) {
+            throw new IllegalArgumentException("CamelContext is not started");
+        }
+        service.stop();
+    }
+
+    @Override
+    public String getState() {
+        // must use String type to be sure remote JMX can read the attribute 
without requiring Camel classes.
+        if (service instanceof StatefulService) {
+            ServiceStatus status = ((StatefulService) service).getStatus();
+            return status.name();
+        }
+
+        // assume started if not a ServiceSupport instance
+        return ServiceStatus.Started.name();
+    }
+
+    @Override
+    public String getCamelId() {
+        return context.getName();
+    }
+
+    @Override
+    public Collection<String> getNamespaces() {
+        return CamelClusterServiceHelper.lookupService(context)
+            .map(CamelClusterService::getNamespaces)
+            .orElseGet(Collections::emptyList);
+    }
+
+    @Override
+    public void startView(String namespace) throws Exception {
+        Optional<CamelClusterService> service = 
CamelClusterServiceHelper.lookupService(context);
+        if (service.isPresent()) {
+            service.get().startView(namespace);
+        }
+    }
+
+    @Override
+    public void stopView(String namespace) throws Exception {
+        Optional<CamelClusterService> service = 
CamelClusterServiceHelper.lookupService(context);
+        if (service.isPresent()) {
+            service.get().stopView(namespace);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/06aa9737/camel-core/src/main/java/org/apache/camel/spi/ManagementNamingStrategy.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/main/java/org/apache/camel/spi/ManagementNamingStrategy.java 
b/camel-core/src/main/java/org/apache/camel/spi/ManagementNamingStrategy.java
index d5bb88e..d331613 100644
--- 
a/camel-core/src/main/java/org/apache/camel/spi/ManagementNamingStrategy.java
+++ 
b/camel-core/src/main/java/org/apache/camel/spi/ManagementNamingStrategy.java
@@ -30,6 +30,7 @@ import org.apache.camel.Processor;
 import org.apache.camel.Producer;
 import org.apache.camel.Route;
 import org.apache.camel.Service;
+import org.apache.camel.ha.CamelClusterService;
 
 /**
  * Strategy for computing {@link ObjectName} names for the various beans that 
Camel register for management.
@@ -68,6 +69,8 @@ public interface ManagementNamingStrategy {
 
     ObjectName getObjectNameForService(CamelContext context, Service service) 
throws MalformedObjectNameException;
 
+    ObjectName getObjectNameForClusterService(CamelContext context, 
CamelClusterService service) throws MalformedObjectNameException;
+
     ObjectName getObjectNameForThreadPool(CamelContext context, 
ThreadPoolExecutor threadPool, String id, String sourceId) throws 
MalformedObjectNameException;
 
     ObjectName getObjectNameForEventNotifier(CamelContext context, 
EventNotifier eventNotifier) throws MalformedObjectNameException;

http://git-wip-us.apache.org/repos/asf/camel/blob/06aa9737/camel-core/src/main/java/org/apache/camel/spi/ManagementObjectStrategy.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/main/java/org/apache/camel/spi/ManagementObjectStrategy.java 
b/camel-core/src/main/java/org/apache/camel/spi/ManagementObjectStrategy.java
index 0b06d65..a260665 100644
--- 
a/camel-core/src/main/java/org/apache/camel/spi/ManagementObjectStrategy.java
+++ 
b/camel-core/src/main/java/org/apache/camel/spi/ManagementObjectStrategy.java
@@ -27,6 +27,7 @@ import org.apache.camel.Processor;
 import org.apache.camel.Producer;
 import org.apache.camel.Route;
 import org.apache.camel.Service;
+import org.apache.camel.ha.CamelClusterService;
 import org.apache.camel.model.ProcessorDefinition;
 
 /**
@@ -60,6 +61,8 @@ public interface ManagementObjectStrategy {
 
     Object getManagedObjectForService(CamelContext context, Service service);
 
+    Object getManagedObjectForClusterService(CamelContext context, 
CamelClusterService service);
+
     Object getManagedObjectForThreadPool(CamelContext context, 
ThreadPoolExecutor threadPool,
                                          String id, String sourceId, String 
routeId, String threadPoolProfileId);
 

Reply via email to