ActiveMQ 发布订阅模式
一、发布/订阅模式生产者
package com.study.queue;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.Topic;
import org.apache.activemq.ActiveMQConnectionFactory;
/*
* 发布/订阅模式生产者
*/
public class TestTopicProducer {
private static String brokerURL = "tcp://0.0.0.0:61616";
private static String queueName = "testQueue";
public static void main(String[] args) {
//1.创建ConnectionFactory 需要指定服务端ip和端口
ConnectionFactory factory = new ActiveMQConnectionFactory(brokerURL);
//2.使用ConnectionFactory创建connection对象
Connection connection;
try {
connection = factory.createConnection();
//3.开启连接,调用Connection对象的start方法。
connection.start();
//使用Connection对象创建session对象
//4.第一个参数是否开启事务,第二个参数是接收者的签收状态
Session session =connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//5.使用session对象创建Destination对象 目标创建一个Topic对象
Topic topic = session.createTopic(queueName);
//6.使用session对象创建一个producer对象
MessageProducer messageProducer = session.createProducer(topic);
//7.创建Message对象
TextMessage message = session.createTextMessage();
message.setText("hello activeMq");
//8.使用producer对象发送消息
messageProducer.send(message);
//9.关闭资源
messageProducer.close();
session.close();
connection.close();
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
二、发布/订阅模式消费者`
package com.study.queue;
import java.io.IOException;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.Topic;
import org.apache.activemq.ActiveMQConnectionFactory;
/*
* 创建发布/订阅消费者 异步方式
*/
public class TestTopicConsumerSync {
private static String brokerURL = "tcp://0.0.0.0:61616";
private static String queueName = "testQueue";
public static void main(String[] args) {
//1.创建ConnectionFactory 需要指定服务端ip和端口
ConnectionFactory factory = new ActiveMQConnectionFactory(brokerURL);
//2.使用ConnectionFactory创建connection对象
Connection connection;
try {
connection = factory.createConnection();
//3.开启连接,调用Connection对象的start方法。
connection.start();
//使用Connection对象创建session对象
//4.第一个参数是否开启事务,第二个参数是接收者的签收状态
Session session =connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//5.使用session对象创建Destination对象 目标创建一个Topic对象
Topic topic = session.createTopic(queueName);
//6.使用session对象创建一个Consumer对象
MessageConsumer messageConsumer = session.createConsumer(topic);
//7.监听消息
messageConsumer.setMessageListener(new MessageListener() {
public void onMessage(Message message) {
if(message instanceof TextMessage){
TextMessage textMessage = (TextMessage) message;
try {
System.err.println("接收到的消息内容:"+textMessage.getText());
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
});
//不让程序结束
System.in.read();
//8.关闭资源
messageConsumer.close();
session.close();
connection.close();
System.out.println("消息接收成功!");
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
注意:测试时要先启动消费者后再启动生产者
三、点对点模式和发布/订阅模式比较
四、订阅模式说明
1.活动的持久的订阅者
2.离线的持久的订阅者
3.活动的非持久的订阅者
如果设置持久的订阅者,需要设置clientID。
//设置connection的clientID
connection.setClientID(“lxr”);
//创建消费者的方式修改成下面这种方式
//6.使用session对象创建一个TopicSubscriber对象
TopicSubscriber topicSubscriber = session.createDurableSubscriber(topic, “”);
`package com.study.queue;
import java.io.IOException;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.Topic;
import javax.jms.TopicSubscriber;
import org.apache.activemq.ActiveMQConnectionFactory;
/*
-
创建发布/订阅消费者 异步方式
*/
public class TestTopicConsumerSync {private static String brokerURL = “tcp://0.0.0.0:61616”;
private static String queueName = “testQueue”;public static void main(String[] args) {
//1.创建ConnectionFactory 需要指定服务端ip和端口
ConnectionFactory factory = new ActiveMQConnectionFactory(brokerURL);
//2.使用ConnectionFactory创建connection对象
Connection connection;
try {
connection = factory.createConnection();
//设置connection的clientID
connection.setClientID(“lxr”);
//3.开启连接,调用Connection对象的start方法。
connection.start();
//使用Connection对象创建session对象
//4.第一个参数是否开启事务,第二个参数是接收者的签收状态
Session session =connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//5.使用session对象创建Destination对象 目标创建一个Topic对象
Topic topic = session.createTopic(queueName);
//6.使用session对象创建一个TopicSubscriber对象
TopicSubscriber topicSubscriber = session.createDurableSubscriber(topic, “”);
//7.监听消息
topicSubscriber.setMessageListener(new MessageListener() {
public void onMessage(Message message) {
if(message instanceof TextMessage){
TextMessage textMessage = (TextMessage) message;
try {
System.err.println(“接收到的消息内容:”+textMessage.getText());
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
});
//不让程序结束
System.in.read();
//8.关闭资源
topicSubscriber.close();
session.close();
connection.close();
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
`
启动时就会发现活动的持久的订阅者下面会有一条数据
关闭时离线的持久的订阅者会有一条数据