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&amp;wireFormat.maxFrameSize=104857600"
/>