activeMQ的Pub/Sub模型
简单代码示例
1. 订阅者Subscriber01类
package consumer;
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
public class Subscriber01
{
public static void main(String[] args) throws JMSException
{
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://127.0.0.1:61616");
Connection connection = connectionFactory.createConnection();
//持久订阅,需要分配一个id来表示订阅者
connection.setClientID("subscriber-01");
connection.start();
Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
//创建1个topic
Topic topic = session.createTopic("activeMQ-topic-1");
MessageConsumer messageConsumer = session.createDurableSubscriber(topic,"subscriber-01");
//接受消息,采用同步的方式
TextMessage textMessage = (TextMessage) messageConsumer.receive();
//把接受到的消息显示在控制台上
System.out.println("订阅者01接受到的信息是:" + textMessage.getText());
//关闭资源
messageConsumer.close();
session.close();
connection.close();
}
}
2. 订阅者Subscriber02类
package consumer;
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
public class Subscriber02
{
public static void main(String[] args) throws JMSException
{
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://127.0.0.1:61616");
Connection connection = connectionFactory.createConnection();
//持久订阅,需要分配一个id来表示订阅者
connection.setClientID("subscriber-02");
connection.start();
Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
//创建1个topic
Topic topic = session.createTopic("activeMQ-topic-1");
MessageConsumer messageConsumer = session.createDurableSubscriber(topic,"subscriber-02");
//接受消息,采用同步的方式
TextMessage textMessage = (TextMessage) messageConsumer.receive();
//把接受到的消息显示在控制台上
System.out.println("订阅者02接受到的信息是:" + textMessage.getText());
//关闭资源
messageConsumer.close();
session.close();
connection.close();
}
}
3. 运行Subscriber01和02后,后台active mq界面
4. 发布者publisher代码
package product;
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
public class Publisher
{
public static void main(String[] args) throws JMSException
{
//创建链接,链接到1个activeMQ的broker实例上,端口使用active默认的61616。
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://127.0.0.1:61616");
Connection connection = connectionFactory.createConnection();
//开启链接
connection.start();
//创建1个session会话,第一个参数:是否支持事务,先选择不支持。第二个参数:表示签收的模式,这里选择自动签收。
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//创建1个topic的名字叫activeMQ-1
Topic topic = session.createTopic("activeMQ-topic-1");
//创建消息的生产者
MessageProducer messageProducer = session.createProducer(topic);
//创建1个消息
TextMessage textMessage = session.createTextMessage("welcome to learn activeMQ-topic!");
//发送消息
messageProducer.send(textMessage);
//关闭资源
messageProducer.close();
session.close();
connection.close();
}
}
5. 运行Publisher后,后台active mq界面
6. 开发环境控制台输出信息
7. 小结Pub/Sub模型特点
- 1个消息可以有多个消费者
- 发送者和接受者在时间上没有依赖性
即针对某个主题(Topic)必须先创建一个订阅者之后,才能消费发布者的消息。为了消费消息,订阅者必须保持运行的状。为了缓和这样严格的时间相关性,JMS允许订阅者创建一个可持久化的订阅。这样,即使订阅者没有被激活(运行),它也能接收到发布者的消息。