ActiveMQ简介
ActiveMQ是Apache推出的,一款开源的,完全支持JMS1.1和J2EE 1.4规范的JMSProvider实现的消息中间件(Message Oriented Middleware,MOM),最主要的功能就是:实现JMS Provider,用来帮助实现高可用、高性能、可伸缩、易用和安全的企业级面向消息服务的系统。ActiveMQ安装和基本使用
1、 安装 JDK 并配置环境变量(略)
参考博客: Linux下安装jdk1.72、 下载 Linux 版的 最新版ActiveMQ,并上传到服务器
http://apache.fayea.com/activemq/3、 解压安装
$ tar -zxvf apache-activemq-5.14.5-bin.tar.gz
$ mv apache-activemq-5.14.5 activemq
#如果启动脚本 activemq 没有可执行权限,此时则需要授权(此步可选)
$ cd /usr/local/activemq/bin/
$ chmod 755 ./activemq
4.打开防火墙端口
参考博客: Linux关闭防火墙5.启动activemq
$ cd /usr/local/activemq/bin/
$ ./activemq start
6.打开管理界面:http://172.20.1.205:8161 登录账号密码默认:admin/admin
7.安全配置(消息安全)
ActiveMQ 如果不加入安全机制的话,任何人只要知道消息服务的具体地址(包括 ip,端口,消息地址[队列或者主题地址],),都可以肆无忌惮的发送、接收消息。关于ActiveMQ 安装配置参考: http://activemq.apache.org/security.htmlActiveMQ 的消息安全配置策略有多种,我们以简单授权配置为例:
在 conf/activemq.xml 文件中在 broker 标签内的最后位置加入以下内容即可:
$ vi /usr/local/activemq/conf/activemq.xml
<plugins>
<simpleAuthenticationPlugin>
<users>
<authenticationUser username="ryx" password="ryx" groups="users,admins"/>
</users>
</simpleAuthenticationPlugin>
</plugins>
定义了一个 ryx 用户,密码为 ryx,角色为 users,admins
设置登录用户 admin 的用户名和密码:
将authenticate 的值设为 true(默认)
$ vi /usr/local/activemq/conf/jetty.xml
<bean id="securityConstraint" class="org.eclipse.jetty.util.security.Constraint">
<property name="name" value="BASIC" />
<property name="roles" value="admin" />
<property name="authenticate" value="true" />
</bean>
控制台的登录用户名密码保存在 conf/jetty-realm.properties 文件中,内容如下:
$ vi /usr/local/activemq/conf/jetty-realm.properties
# Defines users that can access the web (console, demo, etc.)
# username: password [,rolename ...]
admin: admin, admin
user: user, user
注意:用户名和密码的格式是
用户名 : 密码 ,角色名
重启:
/usr/local/activemq/bin/activemq restart
8.消息生产者也与消息消费者测试
Producer类
package com.ryx.test;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.DeliveryMode;
import javax.jms.Destination;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnectionFactory;
public class Producer {
public static void main(String[] args) throws Exception {
//根据用户名,密码,url创建一个连接工厂
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("ryx", "ryx", "tcp://172.20.1.205:61616");
//从工厂中获取一个连接
Connection connection = connectionFactory.createConnection();
connection.start();
//第一个参数:是否支持事务,如果为true,则会忽略第二个参数,被jms服务器设置为SESSION_TRANSACTED
//第二个参数为false时,paramB的值可为Session.AUTO_ACKNOWLEDGE,Session.CLIENT_ACKNOWLEDGE,DUPS_OK_ACKNOWLEDGE其中一个。
//Session.AUTO_ACKNOWLEDGE为自动确认,客户端发送和接收消息不需要做额外的工作。哪怕是接收端发生异常,也会被当作正常发送成功。
//Session.CLIENT_ACKNOWLEDGE为客户端确认。客户端接收到消息后,必须调用javax.jms.Message的acknowledge方法。jms服务器才会当作发送成功,并删除消息。
//DUPS_OK_ACKNOWLEDGE允许副本的确认模式。一旦接收方应用程序的方法调用从处理消息处返回,会话对象就会确认消息的接收;而且允许重复确认。
Session session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
//=======================================================================
//创建一个到达的目的地(队列),如果这个队列不存在,将会被创建
//点对点模式 session.createQueue
Destination destination = session.createQueue("ryx.consumption.counting");
//发布订阅模式
//Destination destination = session.createTopic("ryx.consumption.counting");
//=======================================================================
//从session中,获取一个消息生产者
MessageProducer producer = session.createProducer(destination);
//设置生产者的模式,有两种可选
//DeliveryMode.PERSISTENT 当activemq关闭的时候,队列数据将会被保存
//DeliveryMode.NON_PERSISTENT 当activemq关闭的时候,队列里面的数据将会被清空
producer.setDeliveryMode(DeliveryMode.PERSISTENT);
//创建一条消息,当然,消息的类型有很多,如文字,字节,对象等,可以通过session.create..方法来创建出来
TextMessage message = session.createTextMessage("这是一首简单的小情歌");
Thread.sleep(1000);
//通过消息生产者发出消息
producer.send(message);
session.commit();
session.close();
connection.close();
}
}
Consumer类
package com.ryx.test;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnectionFactory;
public class Consumer {
public static void main(String[] args) throws Exception {
//根据用户名,密码,url创建一个连接工厂
ConnectionFactory cf = new ActiveMQConnectionFactory("ryx", "ryx", "tcp://172.20.1.205:61616");
//从工厂中获取一个连接
Connection connection = cf.createConnection();
connection.start();
//第一个参数:是否支持事务,如果为true,则会忽略第二个参数,被jms服务器设置为SESSION_TRANSACTED
//第二个参数为false时,paramB的值可为Session.AUTO_ACKNOWLEDGE,Session.CLIENT_ACKNOWLEDGE,DUPS_OK_ACKNOWLEDGE其中一个。
//Session.AUTO_ACKNOWLEDGE为自动确认,客户端发送和接收消息不需要做额外的工作。哪怕是接收端发生异常,也会被当作正常发送成功。
//Session.CLIENT_ACKNOWLEDGE为客户端确认。客户端接收到消息后,必须调用javax.jms.Message的acknowledge方法。jms服务器才会当作发送成功,并删除消息。
//DUPS_OK_ACKNOWLEDGE允许副本的确认模式。一旦接收方应用程序的方法调用从处理消息处返回,会话对象就会确认消息的接收;而且允许重复确认。
final Session session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
//=======================================================================
//创建一个到达的目的地(队列),如果这个队列不存在,将会被创建
//点对点模式 session.createQueue
Destination destination = session.createQueue("ryx.consumption.counting");
//发布订阅模式
//Destination destination = session.createTopic("ryx.consumption.counting");
//=======================================================================
//创建一个消费者
MessageConsumer consumer = session.createConsumer(destination);
Message message = consumer.receive();
while(message!=null) {
TextMessage txtMsg = (TextMessage)message;
session.commit();
System.out.println("收到消 息:" + txtMsg.getText());
message = consumer.receive(1000L);
}
session.close();
connection.close();
}
}