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是需要我们手动安装的,他的下载地址是clone or download",然后把整个压缩文件传递到linux服务器里,解压缩之后,在stomp文件夹里使用# python setup.py install,然后就看见如下文字可以证明stomp已经安装成功了:
然后我们来写一个简单的测试队列的脚本,脚本内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | [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”的队列,这个队列里传输一个消息,消息的内容就是
1 | hello,this is my test message! |
启动一下这个脚本,我们看一下linux端的效果。
如果MQ没有启动或者61613端口没有监听的话,那么脚本的反馈是这样的:
再看一下web界面:
可见已经生成了chenshuo这个队列,而且入列和出列的消息数是3个(因为我之前传递了两个做实验),上面这个脚本是成功的。
可以看出,这三个消息已经被消费了,虽然没有“消费者”但是他们依旧处于dequeued状态。
下面就可以用python把整个这个脚本实现出来。
注意!如果执行的时候爆出“No handlers could be found for logger "stomp.py"”的错误,去检查一下IP地址是否正确、MQ密码是否正确、61613端口是否存在,如果61613端口没有在监听,检查一下activemq.xml里,下面这句话是不是被干掉了。
1 | <transportConnector name= "stomp" uri= "stomp://0.0.0.0:61613?maximumConnections=1000&wireFormat.maxFrameSize=104857600" /> |