Activemq是每一位运维工作人员必须掌握的一款软件,他是公司运行的命脉之一,既然如此重要,那么它的看门狗也是比较含金量的。Activemq的看门狗不是像那种# ps -ef|grep mq看进程或者#netstat -ntpl|grep 61613这样直白,因为Activemq还有一种假死情况,那就是“进程和端口都在,但是队列已经死掉了”,遇到这种情况就必须重启当前的activemq。


那么要写出这样的一个脚本,需要满足以下条件:

1)因为mq是集群,有主备之分,首先我们先在集群里所有的机器61613端口是否监听;

2)如果只有一台机器61613端口正常,往mq里添加信息,如果信息可以成功添加到对应的队列里,那么可以证明mq是正常的;

3)如果有多台61613端口正常,重启所有的集群mq机器;

4)如果是零台61613端口正常,也重启所有的集群mq机器;


以上就是我们mq看门狗脚本的逻辑思路,这里我们用python语言来写,为什么要用python,因为python有一个stomp模块,这个模块是镇服activemq失灵的不二法宝!


首先这个stomp是需要我们手动安装的,他的下载地址是https://github.com/jasonrbriggs/stomp.py,选择"clone or download",然后把整个压缩文件传递到linux服务器里,解压缩之后,在stomp文件夹里使用# python setup.py install,然后就看见如下文字可以证明stomp已经安装成功了:

wKiom1hXxpGjo4PuAABrjibDD8Q123.png


然后我们来写一个简单的测试队列的脚本,脚本内容如下:

[root@zabbix ~]# cat mqtest.py 
import time
import sys
import stomp
class MyListener(object):
    def on_error(self, headers, message):
        print('received an error %s' % message)
    def on_message(self, headers, message):
        print('received a message %s' % message)
conn = stomp.Connection([('mq的内网ip地址',61613)])
  
conn.set_listener('', MyListener())
conn.start()
conn.connect('mq的账号','mq的密码')
conn.subscribe(destination='/queue/chenshuo', id=1, ack='auto')
conn.send(body='hello,this is my test message!', destination='/queue/chenshuo')
time.sleep(2)
conn.disconnect()


在这个脚本里,我们把mq的内网地址作为连接地址,因为这样做很安全,其次我们建立一个叫“chenshuo”的队列,这个队列里传输一个消息,消息的内容就是

hello,this is my test message!

启动一下这个脚本,我们看一下linux端的效果。

wKioL1hXyLXC-LSzAAAbV400YRU060.png


如果MQ没有启动或者61613端口没有监听的话,那么脚本的反馈是这样的:

wKiom1hYnW_DcmgRAABp4qbDhc4842.png

再看一下web界面:

wKioL1hXyPmhF5LzAACmWtliP6Q997.png

可见已经生成了chenshuo这个队列,而且入列和出列的消息数是3个(因为我之前传递了两个做实验),上面这个脚本是成功的。


可以看出,这三个消息已经被消费了,虽然没有“消费者”但是他们依旧处于dequeued状态。


下面就可以用python把整个这个脚本实现出来。


注意!如果执行的时候爆出“No handlers could be found for logger "stomp.py"”的错误,去检查一下IP地址是否正确、MQ密码是否正确、61613端口是否存在,如果61613端口没有在监听,检查一下activemq.xml里,下面这句话是不是被干掉了。

<transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>