文档章节

JMX监控ActiveMQ消息队列

榴莲雪糕
 榴莲雪糕
发布于 2017/07/25 15:04
字数 1027
阅读 31
收藏 0
点赞 1
评论 0

1、JMX监控

activemq官方提供的监控页面,只适合用于观察,监控某个队列消息的入队,出队,消费情况。实际在使用过程中,多个应用连接mq时,出现下列情况时,监控无法及时解决,我们也不可能时刻去关注监控页面。某个队列,生产速度太快,消费速度慢,导致空间爆满,mq进程挂掉;mq进程挂掉,所有东西都免谈,无法做任何事情。所以我们要避免该情况发生,可以通过另外一种方式JMX去对mq中的所有队列进行监听。

下面讲解一下配置过程:

(1)修改conf/active.xml

<managementContext createConnector="true" connectorPort="11091"/>

伪分布式mq集群,注意端口号11099不要冲突。

(2)修改bin/activemq

ACTIVEMQ_SUNJMX_START="-Dcom.sun.management.jmxremote.port=11091"
ACTIVEMQ_SUNJMX_START="$ACTIVEMQ_SUNJMX_START -Dcom.sun.management.jmxremote.password.file=${ACTIVEMQ_CONF}/jmx.password"
ACTIVEMQ_SUNJMX_START="$ACTIVEMQ_SUNJMX_START -Dcom.sun.management.jmxremote.access.file=${ACTIVEMQ_CONF}/jmx.access"
ACTIVEMQ_SUNJMX_START="$ACTIVEMQ_SUNJMX_START -Dcom.sun.management.jmxremote.ssl=false"

其中,端口号11091,即步骤(1)中的端口号,每个mq服务conf/active.xml和bin/activemq端口号要一致。

(3)chmod 400 /conf/jmx.*
 jmx.password和jmx.access 文件权限必须是当前用户只读(也就是400)否则会使得activemq无法启动,而且没有任何地方报错。

(4)Linux服务器的hosts文件,不要用127.0.0.1,用真实IP

192.168.25.105  localhost localhost.localdomain localhost4 localhost4.localdomain4

配置完成,重启mq服务,注意,mq集群中的所有服务都要这么配置。

(5)JMX远程链接,非常简单。

这里省去了非常具体的数据,获取到queue和topic之后,就可以做爱做的事了!

其中,url是“service:jmx:rmi:///jndi/rmi://172.172.177.17:11091/jmxrmi;”,ip为mq服务器所在IP,端口号为步骤(1)中配置的,注意,jmx只能连上mq集群的master,连不上的报这个错:

       No broker is found at any of the 1 configured urls

而我们又无法确定master到底为哪台机器,所以应该所有url都尝试链接一下。完!

2、解决无法确定master及线程递增问题

由于集群比较多,所以我们异步采用上述方式循环监控activemq。在程序运行过程中,发现一个非常严重的问题,线程数在不断递增,飙升至400多个。于是用Java自带的visualVM,连接至本地tomcat调试。

集群有4台服务器,按上述操作,需要循环连接4次,只有master能连接成功。每次连接,程序都会创建一个名为JMX client heartbeat n(n表示整数)的线程,随着连接次数的递增而不断递增。由此,我们猜想,可能是JMX没有执行关闭连接导致。于是,在程序中调用connection.shutdown()方法,重新观察。

加入connection.shutdown()之后

1、发现只有连接成功的时候,调用connection.shutdown()会关闭JMX client heartbeat n(n表示整数)的线程

2、连接失败的情况下,关闭无效,心跳线程依然存在。

如下图:

于是debug看了一下源码,发现途中步骤1连接创建后,JMX client heartbeat n(n表示整数)就会出现,而在接下来的步骤中才会判断连接的机器是否是master,一旦判断失败,返回的连接信息 JMXConnector connector为null,无法执行关闭操作,这回导致JMX client heartbeat n(n表示整数)一直存在,占用线程,至此,线程数一直递增的问题也就明了了。

对开发者来说,避免这种问题的方法就是你要明确知道哪台机器是master,传正确的url,只要能连接成功就可以避免这个问题,显然这是不现实的。因此,依然用debug方式调试了一下JMX的连接过程,发现JMX程序内部会自己的切割jmxurl,如下图:

所以改变一下入参方式,url参数写全url,用“,”隔开,无需在外层做循环,JMX会自己判断哪台机器是master,重新试了一下,发现调用后JMX client heartbeat n(n表示整数)消失了,问题解决。

如下图

代码如下:

 

 

© 著作权归作者所有

共有 人打赏支持
榴莲雪糕
粉丝 0
博文 9
码字总数 4706
作品 0
南京
程序员
Ubuntu下安装ActiveMQ

主要参考http://www.jmkg.co.uk/2010/08/31/installing-activemq-on-ubuntu/,略有补充 1. 下载安装包,建立activemq用户,安装 下载最新的activemq,写此文时为5.7。 cd /opt/tar xvzf xxx...

RuralHunter
2013/01/22
0
0
activeMQ5官方文档翻译-运行消息中间件

把activeMQ中间件运行起来 注:如果你想以内嵌的方式来使用消息中间件的话你可以参照怎么在一个连接中间嵌入消息中间件 以二进制文件的方式分发的ActiveMQ自带了一个'activemq'的脚本文件来运...

z_jordon
2015/05/31
0
0
ActiveMQ 持久化(数据库),查询队列剩余消息数、出队数的实现

《ActiveMQ 持久化(文件),查询队列剩余消息数、出队数的实现》分析了消息队列持久化保存,假如activemq服务器突然停止,服务器启动后,还可以继续查找队列中的消息。现在分析队列中的消息...

cookqq
2013/03/04
0
0
ActiveMQ 持久化(文件),查询队列剩余消息数、出队数的实现

本人博客开始迁移,博客整个架构自己搭建及编码 http://www.cookqq.com/listBlog.action 《ActiveMQ发消息和收消息》详细介绍了ActiveMQ发消息和收消息,消息保存在消息队列(queue)中,消息...

cookqq
2013/03/03
0
1
ActiveMQ队列消息积压问题调研

摘要 公司运维同事针对ActiveMQ提出了两个问题,其中一个是“队列长时间无人监听时,自动删除该队列”。 调研提出了三种方案。这里是相关记录和说明。 问题 运维同事对生产环境使用的ActiveM...

winters1224
06/26
0
0
ActiveMQ 消息服务(一)

1、百度百科对ActiveMQ的解释: ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线。ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,尽管JMS规范出台已经是很久的...

Andy市民
2015/11/06
0
0
深入浅出 消息队列 ActiveMQ

一、 概述与介绍 ActiveMQ 是Apache出品,最流行的、功能强大的即时通讯和集成模式的开源服务器。ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现。提供客户端支持跨语言和...

亮liang
2015/05/27
0
0
.Net平台下ActiveMQ入门实例

1.ActiveMQ简介 先分析这么一个场景:当我们在网站上购物时,必须经过,下订单、发票创建、付款处理、订单履行、航运等。但是,当用户下单后,立即跳转到“感谢那您的订单” 页面。不仅如此,...

postdep
2015/08/24
0
0
ActiveMQ集群方案(下)

版权声明:欢迎转载,但是看在我辛勤劳动的份上,请注明来源:http://blog.csdn.net/yinwenjie(未经允许严禁用于商业用途!) https://blog.csdn.net/yinwenjie/article/details/51205822 目...

yunlielai
04/15
0
0
消息队列篇—详谈ActiveMQ消息队列模式的分析及使用

消息队列(Message Queue)是分布式系统中重要的组件,通用使用场景可以简单地描述为当不需要立即获得结果,但是并发量需控制时就需要使用消息队列。消息列队有两种消息模式,一种是点对点的...

afreon
04/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

时间复杂度

1. 维基上的定义 在计算机科学中,算法的时间复杂度是一个函数,它定性描述该算法的运行时间。这是一个代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号表述,不包括这个函数的低...

liuyan_lc
11分钟前
0
0
js中的~符

~是js里的按位取反操作符,~~就是执行两次按位取反,其实就是保持原值,但是注意虽然是原值,但是对布尔型变量执行这个操作,会转化成相应的数值型变量,也就是 ~~true === 1,~~false === 0...

JamesView
12分钟前
0
0
webpack安装

npm install --save-dev webpack-cli

Vincent-Duan
14分钟前
0
0
实时监听EditText内容变化

主要是addTextChangedListener方法的使用 aswerEdittext.addTextChangedListener(new TextWatcher() { //编辑框的内容发生改变之前的回调方法 @Override public void before...

王先森oO
18分钟前
0
0
python连接mysql数据库

安装好必要的pymysql插件 pip install pymysql 写好配置文档 DATABASES = { # 'default': { # 'ENGINE': 'django.db.backends.sqlite3', # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), #......

南桥北木
19分钟前
0
0
linux下安装 Zookeeper

Zookeeper 注册中心安装 安装: wget http://www.apache.org/dist/zookeeper/zookeeper-3.3.3/zookeeper-3.3.3.tar.gztar zxvf zookeeper-3.3.3.tar.gzcd zookeeper-3.3.3cp conf/zoo_......

颖辉小居
21分钟前
0
0
C#判断文件的真实类型(非扩展名判断)

public static void CheckFileType() { string path = @"D:\word.doc"; System.IO.FileStream fs = new System.IO.FileStream(path, System.IO.FileMode.Open, System.IO.FileAccess.Read); ......

Lytf
22分钟前
0
0
java - 把日志生成到指定目录

1.按天小时生成日志文件 log4j.appender.ruiming.DatePattern='_'yyyy-MM-dd-HH 2.最大日志文件数据 log4j.appender.ruiming.MaxBackupIndex=100 3.下图画圈圈的很关键,是生成到知道目录必备...

轻量级赤影
23分钟前
0
0
少走弯路,给Java 1~5 年程序员的建议

今天LZ是打算来点干货,因此咱们就不说一些学习方法和技巧了,直接来谈每个阶段要学习的内容甚至是一些书籍。这一部分的内容,同样适用于一些希望转行到Java的同学。 在大家看之前,LZ要先声...

Java填坑之路
23分钟前
1
0
Java transient关键字

transient关键字使用方法 我们都知道一个对象只要实现了Serilizable接口,这个对象就可以被序列化,java的这种序列化模式为开发者提供了很多便利,我们可以不必关系具体序列化的过程,只要这...

蔡小鹏
25分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部