发布订阅模式流程: 监听JMS
1) 客户机发送消息到JMS消息中间件
2) 服务端负责监听JMS消息目的地。
3) 发现JMS里面有消息产生,服务就可以订阅。
特点:
1) 消息可以被多个服务共享
2) 消息直到被所有消费后,消息消失。
// 发布订阅模式发送消息
public class MySendMessageMQ {
@Test
public void sendTopicMessage() throws Exception {
// 创建消息工厂:协议,地址(ip),端口
ConnectionFactory cf = new ActiveMQConnectionFactory(
"tcp://192.168.66.66:61616");
//获取连接
Connection connection = cf.createConnection();
//开启连接
connection.start();
//从连接中获取Session会话
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//获取消息发送目的地
//在JMS消息服务器开辟一块空间,空间名称:myTopic
Topic topic = session.createTopic("myTopic"); //createTopic()发布订阅模式
//创建消息发送者
MessageProducer producer = session.createProducer(topic);
//创建消息
TextMessage message = new ActiveMQTextMessage();
message.setText("这是一条消息");
//发送消息
producer.send(message);
//管理资源
producer.close();
session.close();
connection.close();
}
}
发布订阅模式
发布一条消息 多人接受 所以没有同步模式 只有异步模式
//接受消息:异步模式:使用监听模式接受消息
// 接收消息receiveTopicMessage()类 必须先启动 一直等待 一直监听 消息服务器
@Test
public void receiveTopicMessage() throws Exception{
// 创建消息工厂:参数:协议,地址,端口
ConnectionFactory cf = new ActiveMQConnectionFactory(
"tcp://192.168.66.66:61616");
//获取连接
Connection connection = cf.createConnection();
//开启连接
connection.start();
//从连接中获取Session
//第一个参数:消息事务
//第二个参数:事务使用自动应答模式
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//获取消息发送目的地:
//创建消息发送目的地,相当于在JMS服务器中开辟一块空间,空间名称myTopic
Topic topic = session.createTopic("myTopic"); // 发布订阅模式
//创建消息接受者
MessageConsumer consumer = session.createConsumer(topic);
//使用监听模式接受消息
consumer.setMessageListener(new MessageListener() {
@Override
public void onMessage(Message message) {
if(message instanceof TextMessage){
TextMessage tm = (TextMessage) message;
try {
System.out.println(tm.getText());
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
});
System.in.read(); //一直等待消息的注入
//关闭资源
consumer.close();
session.close();
connection.close();
}