Activemq是著名的消息队列产品,而持久化指的是在mq挂掉的时候,消息不会被抛弃,而是会被继续保存,等待进程复活。这个Activemq的持久化功能必须在5.9版本以上才会实现,而现在官方最新的mq版本是5.14.1,笔者的这个实验也是使用5.14.1版本,实验工具是金山云服务器,规格是2核4G无外网。


#wget http://www.apache.org/dyn/closer.cgi?filename=/activemq/5.14.1/apache-activemq-5.14.1-bin.tar.gz,然后解压缩到指定的文件夹里,我选择的就是根目录,#tar -zxvf  /activemq。


首先需要更改activemq文件夹里的conf/activemq.xml,重点改的是截图里的内容:

Activemq的持久化部署与验证_第1张图片


其中zkaddress写的是对应的zk机器的"内网地址:端口号",多台机器用逗号隔开,默认zk的端口是2181。同时我设定在zk会给mq生成一个叫lctimermq这样一个节点。


这里一定要注意!!!有些童鞋可能出于职业习惯或者思维贯式就把线上环境正在使用的配置文件拿来直接就用,以为线上的东西就是OK的,但是这一条在mq这里绝对不好使!因为mq这里的zk填写的是线上的zk,如果你这时候启动了mq,那么正式线上的消息队列就会转成这台实验机,后果也是灾难性的,这是一个大坑,一定要切记切记~~~~


插播结束,上面那一段里hostname里面对应填写本地的内网ip地址即可。


下面的80指的是“非持久化消息所占内存的百分比”,10GB是“持久化消息所占硬盘大小”,5GB是“临时消息所占硬盘大小”,以上几个值可以根据实际情况调整。


Activemq的持久化部署与验证_第2张图片

这里是端口定义和用户验证的密码等等,61616是mq的工作监听端口,8161是web端的端口,一般来说mq与服务是一对一搭配的,一个mq已经开了61616给A服务,再开一个61615端口给B服务,这样做是有风险的,在生产环境里不推荐。


如果真的由于业务需要一台机器上运行多个ActiveMq,这里主要说一下有什么地方不重复:


1、brokerName名称不能重复

2、端口号不能重复uri = tcp://localhost:50509

3、kahadb路径不能重复

4、管理端口不能重复contextPort = 2019


言归正传,这个activemq.xml保存退出之后,打开同文件夹的credentials.properties,这里是设定mq密码的地方,mq是有两个密码的,一个消息传递用的,另外一个是给web界面用的,这里的密码是给消息传递用的。这里设定好了之后,要记住,同时在zk里也要有这样的一个节点。

wKiom1guk1ih4ifdAAAXzHyU7fw155.png

Activemq的持久化部署与验证_第3张图片


uris的地方是写mq内网地址的地方,同时在密码下面我们规定了一个消息通道的名称,这个通道会在web 界面里体现出来。


改完了mq工作的密码,为了安全,我们还要改一下web界面的密码,mq默认的web界面账号密码都是admin,现在我们把账号还是设定为admin,密码更改一下,那么就需要打开conf/jetty-realm.properties,然后如图:

Activemq的持久化部署与验证_第4张图片

这里把密码改成了mq1118lc,保存退出,启动就会生效。


这还没有完,在5.9以上的版本,要需要更改一个环境变量,这个环境变量是在bin/env里,打开env文件,有ACTIVEMQ_OPTS_MEMORY的字段,本实验机是4G内存,所以我写成ACTIVEMQ_OPTS_MEMORY="-Xms64M -Xmx3G",这句话的意思是:分给activemq最小是64M、最大为3G的可用内存。保存退出。


这里也要注意一下,如果机器使用了3G效果不理想的话,是需要提升内存的,如果提升了物理内存,但是不更改这个env文件对于mq是无效的,所以再提升了物理内存之后别忘了更改env这个文件同时restart  activemq。


至于启动mq,就是在bin文件夹里,./activemq start即可,然后使用./activemq status查看进程情况。搭配好其他的进程服务项,启动mq完毕之后,在浏览器地址栏里输入"外网地址:8161/admin"来到web界面,输入我们刚刚设定的admin/mq1118lc之后就能看见mq的web界面了。选择第一行的queue,就会看到mq的信息总况:

Activemq的持久化部署与验证_第5张图片


MQ有时候会进程存在,但是却不能正常工作,而来到mq的服务器上使用#netstat -ntpl|grep 61616的时候,发现其61616端口根本没有在监听,那么这种情况证明mq的启动其实是失败的,所以这个时候应该来到日志,查看一下日志的信息,从而对症下药。


第一种情况:

wKioL1i2KLWSdZyHAABNm-yEwyw398.png

这是一个ERROR信息,主要问题就是hostname里面带有中文,这里需要更改/etc/hosts文件,把中文去掉。


注意一下,java类型的软件,比如activemq,比如storm,比如zookeeper,他们在识别中文上是很不友好的,所以请避免起中文名!


第二种情况:

如果在启动mq出现如下错误:

3c0e32b19c050b618ba81ae0a7424895.png


那就是activemq的env文件里JAVA_HOME为空,这个时候我们需要先查看一下/etc/profile文件,看到java home的地址,如下:

d38788c65972aab7ea76a037e8e5085e.png


那么就把/usr/jdk1.7.0_79 添加到env文件的JAVA_HOME那一栏里,然后重启MQ即可。



强文推荐!http://blog.csdn.net/yinwenjie/article/details/50991443