文档章节

JMX监控ActiveMQ消息队列

橘子生
 橘子生
发布于 2017/07/25 15:04
字数 1027
阅读 61
收藏 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
博文 10
码字总数 5889
作品 0
南京
程序员
私信 提问
只需三步:内嵌ActiveMQ到SpringBoot应用中

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

天上只北
2018/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-inAction-Broker-学习笔记

Running Broker(运行 broker) ActiveMQ5.0 的二进制发布包中bin 目录中包含一个名为activemq 的脚本, 直接运行这个脚本就可以启动一个broker。 此外也可以通过一下对其进行配置: Broker...

Java搬砖工程师
2018/12/24
0
0
ActiveMQ所能承载的主题/队列数测试

考虑这么一个场景:用监控服务器监控某设备,设备的数量相当庞大,每隔一段时间监控服务器就会把这些设备的最新状态信息投递到消息队列中,浏览器使用ActiveMQ的Ajax技术通过订阅来感兴趣的状...

mallon
2010/08/22
5.6K
1
ActiveMQ 嵌入Tomcat

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

_herbert
2018/08/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

MySQL的分表与分区

MySQL分表分区是解决大数据量导致MySQL性能低下的两种方法。 什么是MySQL分表 从表面意思上看,MySQL分表就是将一个表分成多个表,数据和数据结构都有可能会变。MySQL分表分为垂直分表和水平...

吴伟祥
21分钟前
1
0
MySQL查询执行

当我们希望MySQL能够以更高的性能运行查询时,最好的办法就是弄清楚MySQL是如何优化和执行查询的。一旦理解了这一点,很多查询优化工作实际上就是遵循一些原则让优化器能够按照预想的合理方式...

问题终结者
今天
1
0
CDH5动静态资源池配置与回滚

关于动态 静态资源池的配置以前都有提过,可以从以下几篇了解: YARN动态资源池配置案例 https://yq.aliyun.com/ziliao/346856# Hadoop YARN配置参数剖析(4)—Fair Scheduler相关参数 Hadoop...

hblt-j
今天
3
0
WordPress仿站实战教程

有一个月没有写blog了,一直在学习wordpress的知识,现在能够进行简单的政府企业门户网站的仿制,wordpress的主题订制,一般是对前端要求比较高,wordpress学会了,建站还是非常的快的。下面...

临江仙卜算子
今天
4
0
图像库stb_image

https://github.com/nothings/stb 目前一般主流的图像格式也就是bmp,jpg,png,tga,dds,除了DDS一般是给DX用的,虽然一堆OpenGL程序也有用的,但是我一般只用png和tga, png不用说了,带a...

robslove
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部