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 */
017 package org.apache.activemq.network;
018
019 import org.apache.activemq.broker.BrokerService;
020 import org.apache.activemq.broker.jmx.AnnotatedMBean;
021 import org.apache.activemq.broker.jmx.NetworkBridgeView;
022 import org.apache.activemq.broker.jmx.NetworkBridgeViewMBean;
023 import org.apache.activemq.util.JMXSupport;
024 import org.slf4j.Logger;
025 import org.slf4j.LoggerFactory;
026
027 import javax.management.MalformedObjectNameException;
028 import javax.management.ObjectName;
029 import java.util.HashMap;
030 import java.util.Map;
031
032 public class MBeanNetworkListener implements NetworkBridgeListener {
033
034 private static final Logger LOG = LoggerFactory.getLogger(MBeanNetworkListener.class);
035
036 BrokerService brokerService;
037 ObjectName connectorName;
038 boolean createdByDuplex = false;
039
040 public MBeanNetworkListener(BrokerService brokerService, ObjectName connectorName) {
041 this.brokerService = brokerService;
042 this.connectorName = connectorName;
043 }
044
045 @Override
046 public void bridgeFailed() {
047
048 }
049
050 @Override
051 public void onStart(NetworkBridge bridge) {
052 if (!brokerService.isUseJmx()) {
053 return;
054 }
055 NetworkBridgeViewMBean view = new NetworkBridgeView(bridge);
056 ((NetworkBridgeView)view).setCreateByDuplex(createdByDuplex);
057 try {
058 ObjectName objectName = createNetworkBridgeObjectName(bridge);
059 AnnotatedMBean.registerMBean(brokerService.getManagementContext(), view, objectName);
060 bridge.setMbeanObjectName(objectName);
061 if (LOG.isDebugEnabled()) {
062 LOG.debug("registered: " + bridge + " as: " + objectName);
063 }
064 } catch (Throwable e) {
065 LOG.debug("Network bridge could not be registered in JMX: " + e.getMessage(), e);
066 }
067 }
068
069 @Override
070 public void onStop(NetworkBridge bridge) {
071 if (!brokerService.isUseJmx()) {
072 return;
073 }
074 try {
075 ObjectName objectName = bridge.getMbeanObjectName();
076 if (objectName != null) {
077 brokerService.getManagementContext().unregisterMBean(objectName);
078 }
079 } catch (Throwable e) {
080 LOG.debug("Network bridge could not be unregistered in JMX: " + e.getMessage(), e);
081 }
082 }
083
084
085 protected ObjectName createNetworkBridgeObjectName(NetworkBridge bridge) throws MalformedObjectNameException {
086 Map<String, String> map = new HashMap<String, String>(connectorName.getKeyPropertyList());
087 return new ObjectName(connectorName.getDomain() + ":" + "BrokerName=" + JMXSupport.encodeObjectNamePart((String) map.get("BrokerName")) + "," + "Type=NetworkBridge,"
088 + "NetworkConnectorName=" + JMXSupport.encodeObjectNamePart((String)map.get("NetworkConnectorName")) + "," + "Name="
089 + JMXSupport.encodeObjectNamePart(JMXSupport.encodeObjectNamePart(bridge.getRemoteAddress())));
090 }
091
092 public void setCreatedByDuplex(boolean createdByDuplex) {
093 this.createdByDuplex = createdByDuplex;
094 }
095 }