• ActiveMQ JMX使用


    一、说明

      ActiveMQ使用过程中,可以使用自带的控制台进行相关的操作以及查看,但是当队列数相当多的时候,在查询以及整体的监控上,就可能相当的不便。所以可通过JMX的方式,进行MQ中队列相关指标的以及整体健康性能等收集展示。

    二、JMX功能开启

      2.1、broker标签中添加  userJmx="true":

      

      2.2、配置 managementContext

      

      其中 用户名、密码及权限配置在 jmx.password 和 jmx.access 文件中。

    三、Java应用连接使用

      3.1、获取在线的队列消费者IP

    private static final String queueObjectName = "org.apache.activemq:type=Broker,brokerName=localhost,destinationType=Queue,destinationName=%s";
    	private static final String brokerAddress = "service:jmx:rmi:///jndi/rmi://%s/jmxrmi";
    
    private static List<String> getQueueConsumers(String user, String password, String ip, String queueName) throws Exception{
    		List<String> result = Lists.newArrayList();
    		String url = String.format(brokerAddress, ip);
    		Map<String, Object> credentials = new HashMap<>();
    	    credentials.put(JMXConnector.CREDENTIALS, new String[] {user, password});
    	    
            JMXServiceURL urls = new JMXServiceURL(url);
            
            JMXConnector connector = JMXConnectorFactory.connect(urls,credentials);
            connector.connect();
            MBeanServerConnection conn = connector.getMBeanServerConnection();
            
            ObjectName name = new ObjectName(String.format(queueObjectName, queueName));
            QueueViewMBean queueViewMBean = MBeanServerInvocationHandler.newProxyInstance(conn, name, QueueViewMBean.class, true);
            for (ObjectName mbeanNameConsumerObjectName : queueViewMBean.getSubscriptions()) {
            	SubscriptionViewMBean subscriptionViewMBean = MBeanServerInvocationHandler.newProxyInstance(conn, mbeanNameConsumerObjectName,SubscriptionViewMBean.class, true);
            	ObjectName connectionObjectName = new ObjectName(subscriptionViewMBean.getConnection().getCanonicalName());
            	ConnectionViewMBean connectionViewMBean = MBeanServerInvocationHandler.newProxyInstance(conn, connectionObjectName,ConnectionViewMBean.class, true);
            	if (connectionViewMBean != null) {
            		result.add(connectionViewMBean.getRemoteAddress().replace("//", "").split("\:")[1]);
    //        		System.out.println(connectionViewMBean.getRemoteAddress()+"|"+connectionViewMBean.getClientId());
                }
            }
            return result;
    	}
    

      其中方法的参数: ip - broker的 ip 地址,user - JMX登录访问的用户名,password - JMX登录访问的密码,queueName - 待查询的队列名

       3.2、获取队列的出队、入队以及积压数等指标信息 

    package workMQ;
    
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.Map;
    import java.util.Set;
    
    import javax.management.MBeanServerConnection;
    import javax.management.MBeanServerInvocationHandler;
    import javax.management.ObjectInstance;
    import javax.management.ObjectName;
    import javax.management.openmbean.CompositeData;
    import javax.management.remote.JMXConnector;
    import javax.management.remote.JMXConnectorFactory;
    import javax.management.remote.JMXServiceURL;
    
    import org.apache.activemq.broker.jmx.BrokerViewMBean;
    import org.apache.activemq.broker.jmx.ConnectionViewMBean;
    import org.apache.activemq.broker.jmx.ConnectorViewMBean;
    import org.apache.activemq.broker.jmx.QueueViewMBean;
    
    import com.google.common.collect.Maps;
    
    public class Test08 {
    
    	public static void main(String[] args) throws Exception {
    		
    		String ip = "192.168.25.43:9607";
    		
    		String url = String.format("service:jmx:rmi:///jndi/rmi://%s/jmxrmi",ip);
    		Map<String, Object> credentials = new HashMap<>();
    	    credentials.put(JMXConnector.CREDENTIALS, new String[] {"admin", "activemq"});
    	    
            JMXServiceURL urls = new JMXServiceURL(url);
            
            JMXConnector connector = JMXConnectorFactory.connect(urls,credentials);
            connector.connect();
            MBeanServerConnection conn = connector.getMBeanServerConnection();
            
            ObjectName name = new ObjectName("org.apache.activemq:brokerName=localhost,type=Broker");
            BrokerViewMBean mBean = (BrokerViewMBean)MBeanServerInvocationHandler.newProxyInstance(conn, name, BrokerViewMBean.class, true);
            
            for(ObjectName na : mBean.getQueues()){
                QueueViewMBean queueBean = (QueueViewMBean) MBeanServerInvocationHandler.newProxyInstance(conn, na, QueueViewMBean.class, true);
            	System.out.println("队列的名称:"+queueBean.getName());
            	System.out.println("消息积压数:"+queueBean.getQueueSize());
            	System.out.println("入队:"+queueBean.getEnqueueCount());
            	System.out.println("出队:"+queueBean.getDequeueCount());
            	System.out.println("消费者数:"+queueBean.getConsumerCount());
            	System.out.println("生产者数:"+queueBean.getProducerCount());
            	//还有很多队列指标信息,具体可根据实际使用获取
              }
    	}
    }
    

    四、JDK自带JConsole连接

      1、JDK安装目录下的 bin 文件夹,点击JConsole.exe

      2、选择远程进程,输入 brokerAddress、username、password

      brokerAddress 格式 : service:jmx:rmi:///jndi/rmi://具体的brokerip地址:配置的JMX的port访问端口/jmxrmi

      username、password 即是JMX的访问用户名、密码

      

      3、进入后,可查看相关信息

  • 相关阅读:
    【转】JVM 堆内存设置原理
    【转】Java八种基本数据类型的比较及其相互转化
    8月12日
    并发与竞争
    高通gpio配置输出
    创建一个字符设备的基本流程
    4月2号 字符设备驱动实验
    3.30学习遇到卡死点
    断言函数的用法
    12.02 下午
  • 原文地址:https://www.cnblogs.com/eric-fang/p/11431104.html
Copyright © 2020-2023  润新知