1.ActiveMQ简介
ActiveMQ是Apache出品,最流行的,能力强劲的开源消息总线,完全支持JMS1.1和J2EE 1.4规范,java语言开发的。
主要特点:多种语言编写客户端(java、c、c++、php),对spring支持(易整合),通过jdbc和journal提供高速的消息持久化,客户端-服务器,点对点,支持ajax。
2>ActiveMQ的消息形式
一种是点对点的,即一个生产者和一个消费者一一对应,消息默认就是持久化的
另一种是发布/订阅模式,即一个生产者产生消息并发送后,可以有多个消费者接收,消息一次发送不持久化
官网:http://activemq.apache.org/
2.ActiveMQ的安装(Linux)
1>安装环境:需要jdk、生产环境为Linux系统
2>把ActiveMQ的压缩包.tar.gz上传到Linux系统
3>tar -xvf 文件名.tar.gz命令解压缩
4>进入bin目录下的activemq启动
5>启动:[root@localhost bin]# ./activemq start
6>关闭:[root@localhost bin]# ./activemq stop
7>查看状态:[root@localhost bin]# ./activemq status
注意:如果ActiveMQ整合spring使用不要使用activemq-all-5.12.0.jar包。建议使用5.11.2
进入管理后台:http://192.168.25.131:8161
登录:用户名/密码(admin/admin)
3.ActiveMQ的使用
使用前需要导入5.11.2版本的jar包
1>Queue模式(点对点)
/**
* 消息队列,ActiveMQ的单元测试
* @author SpongBob
*
*/
public class TestActiveMQ {
/**
* Queue:点到点的形式发送消息
* @throws Exception
*/
@Test
public void testQueueProducer() throws Exception{
//第一步:创建ConnectionFactory对象,需要指定服务端ip及端口号。
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.25.131:61616");
//第二步:使用ConnectionFactory对象创建一个Connection对象。
Connection connection = connectionFactory.createConnection();
//第三步:开启连接,调用Connection对象的start方法。
connection.start();
//第四步:使用Connection对象创建一个Session对象。
//第一个参数:是否开启失误。true开启事务,第二个参数就意义一版不开启事务
//第二个参数:应答模式,自动应答或手动应答(CLIENT_ACKNOWLEDGE),一般为自动应答(AUTO_ACKNOWLEDGE)
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//第五步:使用Session对象创建一个Destination对象(topic、queue),此处创建一个Queue对象。
Queue queue = session.createQueue("test-queue");
//第六步:使用Session对象创建一个Producer对象。
MessageProducer producer = session.createProducer(queue);
//第七步:创建一个Message对象,创建一个TextMessage对象。
TextMessage textMessage = session.createTextMessage("hello queue2");
//第八步:使用Producer对象发送消息。
producer.send(textMessage);
//第九步:关闭资源。
producer.close();
session.close();
connection.close();
}
/**
* Queue:点到点接受消息
*/
@Test
public void testQueueConsumer() throws Exception{
//第一步:创建一个ConnectionFactory对象。
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.25.131:61616");
//第二步:从ConnectionFactory对象中获得一个Connection对象。
Connection connection = connectionFactory.createConnection();
//第三步:开启连接。调用Connection对象的start方法。
connection.start();
//第四步:使用Connection对象创建一个Session对象。
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//第五步:使用Session对象创建一个Destination对象。和发送端保持一致queue,并且队列的名称一致。
Queue queue = session.createQueue("test-queue");
//第六步:使用Session对象创建一个Consumer对象。
MessageConsumer consumer = session.createConsumer(queue);
//第七步:接收消息。
consumer.setMessageListener(new MessageListener() {
@Override
public void onMessage(Message message) {
//打印结果
TextMessage textMessage = (TextMessage) message;
String text;
//第八步:打印消息。
try {
text = textMessage.getText();
System.out.println(text);
} catch (Exception e) {
e.printStackTrace();
}
}
});
//一直保持该线程开启,等待接受消息
System.out.println("等待接受消息:");
System.in.read();
//第九步:关闭资源
consumer.close();
session.close();
connection.close();
}
2>topic模式(发布/订阅)
/**
* Topic:发布/订阅格式,--发布消息
*/
@Test
public void testTopicProducer() throws Exception{
//第一步:创建ConnectionFactory对象,需要指定服务端ip及端口号。
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.25.131:61616");
//第二步:使用ConnectionFactory对象创建一个Connection对象。
Connection connection = connectionFactory.createConnection();
//第三步:开启连接,调用Connection对象的start方法。
connection.start();
//第四步:使用Connection对象创建一个Session对象。
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//第五步:使用Session对象创建一个Destination对象(topic、queue),此处创建一个Topic对象。
Topic topic = session.createTopic("test-topic");
//第六步:使用Session对象创建一个Producer对象。
MessageProducer producer = session.createProducer(topic);
//第七步:创建一个Message对象,创建一个TextMessage对象。
TextMessage textMessage = session.createTextMessage("hello topic");
//第八步:使用Producer对象发送消息。
producer.send(textMessage);
//第九步:关闭资源。
producer.close();
session.close();
connection.close();
}
/**
* Topic:发布/订阅格式,--接收消息
* @throws Exception
*/
@Test
public void testTopicConsumer() throws Exception{
//第一步:创建一个ConnectionFactory对象。
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.25.131:61616");
//第二步:从ConnectionFactory对象中获得一个Connection对象。
Connection connection = connectionFactory.createConnection();
//第三步:开启连接。调用Connection对象的start方法。
connection.start();
//第四步:使用Connection对象创建一个Session对象。
Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
//第五步:使用Session对象创建一个Destination对象。和发送端保持一致topic,并且话题的名称一致。
Topic topic = session.createTopic("test-topic");
//第六步:使用Session对象创建一个Consumer对象。
MessageConsumer consumer = session.createConsumer(topic);
//第七步:接收消息。
consumer.setMessageListener(new MessageListener() {
//第八步:打印消息。
String text;
public void onMessage(Message message) {
TextMessage textMessage = (TextMessage) message;
try {
text = textMessage.getText();
System.out.println(text);
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
System.out.println("topic消费者1启动。。。。");
//等待接收消息
System.in.read();
//第九步:关闭资源
consumer.close();
connection.close();
session.close();
}