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);