001/*
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements.  See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License.  You may obtain a copy of the License at
008 *
009 *      http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017package org.apache.camel.management;
018
019import java.util.ArrayList;
020import java.util.List;
021
022import javax.management.ObjectName;
023
024import org.apache.camel.CamelContext;
025import org.apache.camel.NamedNode;
026import org.apache.camel.api.management.ManagedAttribute;
027import org.apache.camel.api.management.ManagedCamelContext;
028import org.apache.camel.api.management.ManagedResource;
029import org.apache.camel.impl.engine.DefaultManagementStrategy;
030import org.apache.camel.spi.ManagementAgent;
031import org.apache.camel.spi.ManagementObjectNameStrategy;
032import org.apache.camel.spi.ManagementObjectStrategy;
033import org.slf4j.Logger;
034import org.slf4j.LoggerFactory;
035
036/**
037 * A JMX capable {@link org.apache.camel.spi.ManagementStrategy} that Camel by default uses if possible.
038 * <p/>
039 * Camel detects whether its possible to use this JMX capable strategy and if <b>not</b> then Camel will fallback to the
040 * {@link DefaultManagementStrategy} instead.
041 *
042 * @see org.apache.camel.spi.ManagementStrategy
043 */
044@ManagedResource(description = "Managed JmxManagementStrategy")
045public class JmxManagementStrategy extends DefaultManagementStrategy {
046
047    private static final Logger LOG = LoggerFactory.getLogger(JmxManagementStrategy.class);
048
049    private final List<Object> managed = new ArrayList<>();
050    private int counter;
051
052    public JmxManagementStrategy() {
053    }
054
055    public JmxManagementStrategy(CamelContext context, ManagementAgent managementAgent) {
056        super(context, managementAgent);
057        // add JMX capable CamelContext as extension
058        context.setExtension(ManagedCamelContext.class, new ManagedCamelContextImpl(context));
059    }
060
061    @Override
062    public void manageObject(Object managedObject) throws Exception {
063        if (!isStartingOrStarted()) {
064            managed.add(managedObject);
065            return;
066        }
067        ObjectName objectName = getManagementObjectNameStrategy().getObjectName(managedObject);
068        if (objectName != null) {
069            getManagementAgent().register(managedObject, objectName);
070            counter++;
071        }
072    }
073
074    @Override
075    public void unmanageObject(Object managedObject) throws Exception {
076        if (!isStartingOrStarted()) {
077            managed.remove(managedObject);
078            return;
079        }
080        ObjectName objectName = getManagementObjectNameStrategy().getObjectName(managedObject);
081        if (objectName != null) {
082            getManagementAgent().unregister(objectName);
083            counter--;
084        }
085    }
086
087    @Override
088    public boolean isManaged(Object managedObject) {
089        try {
090            ObjectName name = getManagementObjectNameStrategy().getObjectName(managedObject);
091            if (name != null) {
092                return getManagementAgent().isRegistered(name);
093            }
094        } catch (Exception e) {
095            LOG.warn("Cannot check whether the managed object is registered. This exception will be ignored.", e);
096        }
097        return false;
098    }
099
100    @Override
101    public boolean isManagedName(Object name) {
102        try {
103            if (name instanceof ObjectName) {
104                return getManagementAgent().isRegistered((ObjectName) name);
105            }
106        } catch (Exception e) {
107            LOG.warn("Cannot check whether the managed object is registered. This exception will be ignored.", e);
108        }
109        return false;
110    }
111
112    @Override
113    public boolean manageProcessor(NamedNode definition) {
114        return true;
115    }
116
117    @ManagedAttribute(description = "Number of managed MBean instances")
118    public int getManagedCount() {
119        return counter;
120    }
121
122    @Override
123    protected void doInit() throws Exception {
124        LOG.info("JMX is enabled");
125        super.doInit();
126    }
127
128    @Override
129    protected void doStart() throws Exception {
130        super.doStart();
131        for (Object o : managed) {
132            manageObject(o);
133        }
134    }
135
136    @Override
137    protected ManagementObjectNameStrategy createManagementObjectNameStrategy(String domain) {
138        return new DefaultManagementObjectNameStrategy(domain);
139    }
140
141    @Override
142    protected ManagementObjectStrategy createManagementObjectStrategy() {
143        return new DefaultManagementObjectStrategy();
144    }
145
146}