JMX监控ActiveMQ消息队列
JMX监控ActiveMQ消息队列
榴莲雪糕 发表于4个月前
JMX监控ActiveMQ消息队列
  • 发表于 4个月前
  • 阅读 9
  • 收藏 0
  • 点赞 0
  • 评论 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
博文 8
码字总数 3626
×
榴莲雪糕
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: