ActiveMQ
第一章 ActiveMQ安装
1.1 普通安装
# 需要jdk支持
yum install java-1.7.0-openjdk-devel # yum源安装了,查找文件稍微麻烦
# 安装启动Active MQ
wget https://archive.apache.org/dist/activemq/5.14.0/apache-activemq-5.14.0-bin.tar.gz
tar -zxvf apache-activemq-5.15.3-bin.tar.gz
cd apache-activemq-5.14.0/bin/
./activemq start
# 检验结果
netstat -anp | grep 61
# 结果
tcp 0 0 0.0.0.0:61613 0.0.0.0:* LISTEN 21378/java # 队列服务端
tcp 0 0 0.0.0.0:61614 0.0.0.0:* LISTEN 21378/java
tcp 0 0 0.0.0.0:61616 0.0.0.0:* LISTEN 21378/java
tcp 0 0 0.0.0.0:8161 0.0.0.0:* LISTEN 21378/java # 队列客户端
1.2 docker安装
# 查询所有匹配镜像
docker search activemq
# 查看结果然后挑一个stars最多的拉取
docker pull webcenter/activemq
# 查看下载下来的镜像
docker images
# 运行activemq容器
docker run -d --name activemq -p 61617:61616 -p 8162:8161 webcenter/activemq:latest
# 然后呢访问本机8162端口查看MQ的web控制台
第二章 ActiveMQ 后台、生产者账号密码配置
大佬地址:https://www.cnblogs.com/chxwkx/p/11149469.html
-
修改conf/activemq.xml
在标签下,找到标签。在这个标签后面添加
broker标签内加上这个配置生产者账号密码才会生效,否则无限制,连接即能操作# broker标签内加上这个配置生产者账号密码才会生效,否则无限制,连接即能操作 <plugins> <simpleAuthenticationPlugin> <users> <authenticationUser username="${activemq.username}" password="${activemq.password}" groups="users,admins"/> </users> </simpleAuthenticationPlugin> </plugins>
./activemq console # 打印出启动的每一步信息,配置出错时可以用这个排错
-
生产者账号密码——修改conf/credentials.properties
activemq.username=<用户名> activemq.password=<密码> guest.password=password
-
后台账号密码——修改conf/jetty-realm.properties
在user下添加用户名密码信息。如test:test1,admin
格式为 用户名:密码,角色。
然后就可以把admin那一行删掉了,开启activemq即可。
第三章 PHP操作activeMQ
3.1 PHP 拓展Stomp安装
wget http://pecl.php.net/get/stomp-1.0.9.tgz
tar xf stomp-1.0.9.tgz
cd stomp-1.0.9
/usr/local/php-fpm/bin/phpize
./configure --with-php-config=/usr/local/php-fpm/bin/php-config
make && make install
配置php.ini文件
# 查找php加载php.ini路径
/usr/local/php-fpm/bin/php --ini
vi /usr/local/php-fpm/etc/php.ini
# 末尾添加
extension_dir = "/usr/local/php-fpm/lib/php/extensions/no-debug-non-zts-20131226/"
extension=stomp.so
然后你就可以写代码操控MQ了
3.2 写代码操控MQ
<?php
# 连接
try {
//61613默认的端口,在ActiveMQ目录conf/activemq.xml文件可查看
$stomp = new Stomp('tcp://39.105.143.144:61613', 'lalala', 'lalala');
} catch (StompException $e) {
die('error: ' . $e->getMessage());
}
# 订阅一个消息队列,
# prefetchSize 一个消费者一次取3条数据,逐一消费,如果此数值过大会导致多消费者时,只有一个忙,其他特别闲
$stomp->subscribe('/queue/email', array('activemq.prefetchSize' => 3);
# 向队列添加消息
$userId = 1000;
try{
$result = $stomp->send('email',json_encode($userId)); //比如发邮件
}catch (StompException $e) {
die('error'.$e->getMessgae());
}
# 读取队列
while (1){
$frame = $stomp->readFrame();
//输出消息体内容
$info = $frame->body;
$queue_name = $frame->headers['destination']; # 队列名称
$message_id = $frame->headers['message-id']; # 队列id
$stomp->ack($frame); // 确认消费 此消息不会被重复消费
if (do()) {
$stomp->nack($frame); // 若处理失败。将消息重新放回队列
}
}
function do(){
something....
return true/false;
}
要想消费者并行消费,开启多进程吧