一、说明

  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、进入后,可查看相关信息

ActiveMQ JMX使用的更多相关文章

  1. activemq jmx

    增加: -Djava.rmi.server.hostname=<IP addr>

  2. JMX操作ActiveMQ(2)

    默认情况下,ActiveMQ使用useJmx后,jmx的url为 service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi 这时,jmx的MBean se ...

  3. JMX与Spring

    1.什么是JMX JMX可以监控类的运行情况,可以在程序运行期查看并修改类属性的信息. 举一个应用实例:在一个系统中常常会有一些配置信息,比如服务的IP地址,端口号什么的,那么如何来写这些代码呢? 下 ...

  4. ActiveMQ笔记(5):JMX监控

    系统上线运行后,及时监控报警是很必要的手段,对于ActiveMQ而言,主要监控的指标有:MQ本身的健康状况.每个队列的生产者数量.消费者数量.队列的当前消息数等. ActiveMQ支持JMX监控,使用 ...

  5. JMX操作ActiveMQ(1)

    我们知道ActiveMQ broker的管理接口是通过JMX方式提供的. 一个简单的访问方式就是通过jconsole,输入 service:jmx:rmi:///jndi/rmi://localhos ...

  6. Zabbix JMX监控之ActiveMQ

    监控原理: ActiveMQ作为依赖java环境的中间件,同样可以像tomcat一样用JMX(java扩展程序)监控.并且与tomcat不同的是,ActiveMQ自带了JMX,只需在配置文件中开启即可 ...

  7. Activemq开启JMX及问题排查

    0.服务端开启JMX服务 一.修改${ ActiveMQ_HOME} /conf/activemq.xml文件 在<broker>标签中添加如下属性:useJMX="true&q ...

  8. (错误)启动ActiveMQ报错:Transport Connector could not be registered in JMX: java.io.IOException: Failed to bind to server socket: stomp://0.0.0.0:61613?

    一.错误报告 很明显,端口被占用 二.解决方法 1. 在cmd中输入 netstat -ano 查看61613端口被占用情况,如果有其他进程使用,则使用 taskkill /f /pid 进程PID  ...

  9. ActiveMQ笔记(1):编译、安装、示例代码

    一.编译 虽然ActiveMQ提供了发布版本,但是建议同学们自己下载源代码编译,以后万一有坑,还可以尝试自己改改源码. 1.1 https://github.com/apache/activemq/r ...

随机推荐

  1. 从无到有构建vue实战项目(七)

    十四.Vuex的使用 Vuex是什么? Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化.Vu ...

  2. Python之基本数据类型概览

    Python之基本数据类型概览 什么是数据类型? 每一门编程语言都有自己的数据类型,例如最常见的数字1,2,3.....,字符串'小明','age','&D8'...,这些都是数据类型中的某一 ...

  3. .gitignore不起作用,过滤规则

    git 通过配置.gitignore文件忽略掉的文件或目录,在.gitignore文件中的每一行保存一个匹配的规则 # 此为注释 – 将被 Git 忽略 *.a :忽略所有 .a 结尾的文件 !lib ...

  4. Leetcode之深度优先搜索&回溯专题-679. 24 点游戏(24 Game)

    Leetcode之深度优先搜索&回溯专题-679. 24 点游戏(24 Game) 深度优先搜索的解题详细介绍,点击 你有 4 张写有 1 到 9 数字的牌.你需要判断是否能通过 *,/,+, ...

  5. Leetcode之回溯法专题-90. 子集 II(Subsets II)

    Leetcode之回溯法专题-90. 子集 II(Subsets II) 给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入 ...

  6. Redis持久化的原理及优化

    更多内容,欢迎关注微信公众号:全菜工程师小辉~ Redis提供了将数据定期自动持久化至硬盘的能力,包括RDB和AOF两种方案,两种方案分别有其长处和短板,可以配合起来同时运行,确保数据的稳定性. RD ...

  7. 51nod 1086 背包问题 V2(二进制优化多重背包)

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1086 题解:怎么用二进制优化多重背包,举一个例子就明白了. ...

  8. hdu2586 How far away ?(lca模版题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2586 题意:给出一棵树还有两个点然后求这两个点的最短距离. 题解:val[a]+val[b]-2*va ...

  9. hive正则表达式的用法

    regexp_replace用法 1.  截取字符串中的汉字部分: 举个栗子:select regexp_replace('七夕节comming!来啦','([^\\u4E00-\\u9FA5]+)' ...

  10. 获取mysql自主生成的主键

    一.sql语句 CREATE TABLE `testgeneratedkeys` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(20) ...