文档章节

JMX监控ActiveMQ消息队列

榴莲雪糕
 榴莲雪糕
发布于 2017/07/25 15:04
字数 1027
阅读 54
收藏 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
南京
程序员
私信 提问
只需三步:内嵌ActiveMQ到SpringBoot应用中

不知你是否有过这样的体验: 在调试带JMS组件的应用时, 需要额外启动一个JMS服务器来配合测试。 这样既操作繁琐,又不利于实现单元测试——不符合单元测试AIR原则(自动化,独立性,可重复,...

天上只北
06/29
0
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
ActiveMQ 嵌入Tomcat

在一些项目中,单独开启一个ActiveMQ,对于项目实施来说有时略显繁琐。所以我们将ActiveMQ内嵌到Tomcat,Tomcat启动同时就顺带启动了ActiveMQ。由此我们需要掌握三个个重要的知识点 ActiveMQ...

_herbert
08/03
0
0
为ActiveMQ增强JMX指标

前端时间学习了一下JMX的写法,相关的学习资料可以百度一下JMX学习。 日常最常用到JMX的地方是监控采集,往往开源项目也都会内置JMX的接口,供Jconsole连接或外部监控程序连接。 JMX的常用写...

MisterCH
11/12
0
0
activeMQ5官方文档翻译-运行消息中间件

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

z_jordon
2015/05/31
0
0

没有更多内容

加载失败,请刷新页面

加载更多

React和Redux的连接react-redux

通过Redux文档来了解react-redux,在一段时间的实践后准备翻一翻源代码,顺便做些相关的总结。我看的代码的npm版本为v4.0.0,也就是说使用的React版本是0.14.x。 react-redux提供两个关键模块...

前端攻城老湿
41分钟前
1
0
1、Mybatis连接池配置 和 Context.xml的配置

注意: (1)mybatis 3.2 之前 通过 set get 方法 获取相关属性。之后通过属性姓名获取相关关联。 (2)mybatis 映射 优先为 sql 语句中的别名与实体类的属性进行映射。 (3)jndi Java用于调...

KingFightingAn
57分钟前
1
0
Android 界面漩涡扭曲动效实现

背景:之前偶然看到优酷有类似的页面切换动画效果。于是自己也打算来实现下这样的效果。 动效说明:点击界面中的任意位置,界面以点击位置作为中心点,开始以漩涡状态,扭曲,收缩。直到消失...

Carlyle_Lee
今天
2
0
聊聊我怎么系统学习Linux技能并快速提高的

聊聊我怎么系统学习Linux技能并快速提高的 随着电子信息科技时代的发展,学会使用计算机在我们的生活中成为了必不可少的一项技能。而作为计算机中的三大操作系统之一的Linux更是饱受计算机爱...

linuxCool
今天
6
0
Android/Java 获取一个byte[]的真实编码,用于解决乱码问题

来源地址:https://blog.csdn.net/qq_31384551/article/details/81627840 一个byte数组,byte[] buf,是由一个字符串转换来的,如何判断字符串使用的是什么编码? Mozilla的一个组件提供了相应...

她叫我小渝
今天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部