文档章节

JMX监控ActiveMQ消息队列

榴莲雪糕
 榴莲雪糕
发布于 2017/07/25 15:04
字数 1027
阅读 40
收藏 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 嵌入Tomcat

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

_herbert
08/03
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
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

没有更多内容

加载失败,请刷新页面

加载更多

RxJS的另外四种实现方式(四)——性能最高的库(续)

接上一篇RxJS的另外四种实现方式(三)——性能最高的库 上一篇文章我展示了这个最高性能库的实现方法。下面我介绍一下这个性能提升的秘密。 首先,为了弄清楚Most库究竟为何如此快,我必须借...

一个灰
36分钟前
1
0
麒麟AI首席科学家现世

8月31日,华为发布了新一代顶级人工智能手机芯片麒麟980,成为全球首款7nm工艺手机芯片,AI方面也实现飞跃,支持人脸识别、物体识别、物体检测、图像分割、智能翻译等。 虽然如今人人都在热议...

问题终结者
昨天
1
0
告警系统主脚本、告警系统配置文件、告警系统监控项目

告警系统主脚本 main.sh内容 #!/bin/bash#Written by aming.# 是否发送邮件的开关export send=1# 过滤ip地址export addr=`/sbin/ifconfig |grep -A1 "ens33: "|awk '/inet/ {pr...

芬野de博客
昨天
2
0
MySQL autocommit探究

-- sessionA:tx_isolation=REPEATABLE-READmysql> select connection_id();+-----------------+| connection_id() |+-----------------+| 28 |+-----------------+......

安小乐
昨天
7
0
c++多线程锁 Mutex  自动判断死锁

c++多线程锁可以使用absl::Mutex std::mutex这两种,下面是demo代码。 使用absl:Mutex的时候打印: [mutex.cc : 1338] RAW: Cycle: [mutex.cc : 1352] RAW: mutex@0x683b68 stack: @ 0x43856......

青黑
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部