ActiveMQ(三)之Java实现简单的activeMQ通讯(topic模式)
Java实现简单的activeMQ通讯(topic)
- topic模式是什么?
例子:广播的形式,我发送一条广播信息,所有的人就会接收到这条广播。
-
topic就是我发送一条消息,所有的消费者都会接收到。
-
生产者将消息发布到topic中,每个消息可以有多个消费者,属于1:N的关系
-
生产者和消费者之间有时间上的相关性。订阅某一个主题的消费者只能消费自它订阅之后发布的消息
- 为什么topic模式下,必须先启动消费者,后启动生产者?
生产者生产时,topic不保存消息它是无状态的不落地,假如无人订阅就去生产,那就是一条废消息,所以,一般先启动消费者再启动生产者。
- 思考:在topic模式下, 生产者先启动,再发送10条消息,最后在启动消费者。问消费者是否接收到这个10消息?
不能接收到这10个消息因为在主题模式中: 只有提前进行订阅的消费者才能成功消费消息。
需求:生产者生产3条消息,3个消费者都会接收到3条消息。这就需要topic模式
- 环境准备, 配置maven依赖
<!-- https://mvnrepository.com/artifact/org.apache.activemq/activemq-all -->
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-all</artifactId>
<version>5.15.11</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.xbean/xbean-spring -->
<dependency>
<groupId>org.apache.xbean</groupId>
<artifactId>xbean-spring</artifactId>
<version>4.15</version>
</dependency>
- 在过一下这张图,记住他的逻辑
1. 生成者生产消息
生成者生产消息基本流程:
创建工厂对象(连接的谁?)
// ACTIVEMQ_URL: 连接的谁, activemq的url地址 ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL);
通过工厂对象生成连接对象,并建立连接
Connection connection = activeMQConnectionFactory.createConnection(); connection.start();
通过连接对象,建立session会话对象
// 第一个参数为是否开启事务,第二个参数为签收 Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
通过session会话对象建立目的地(topic模式)
// TOPIC_NAME 话题名称 Topic topic = session.createTopic(TOPIC_NAME);
通过session会话对象建立生成者(要与目的地建立联系)
// topic: 建立联系 MessageProducer producer = session.createProducer(topic);
发送消息
for (int i = 0; i < 3; i++) { // 创建消息 TextMessage textMessage = session.createTextMessage("msg" + i + ":hello world"); // 将消息发送到MQ producer.send(textMessage); }
释放资源
producer.close(); session.close(); connection.close(); System.out.println("finish");
2. 消费者消费消息(创建3个消费者)
创建工厂对象(连接的谁?)
// ACTIVEMQ_URL: 连接的谁, activemq的url地址 ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL);
通过工厂对象生成连接对象,并建立连接
Connection connection = activeMQConnectionFactory.createConnection(); connection.start();
通过连接对象,建立session会话对象
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
通过session会话对象建立目的地(topic模式)
Topic topic = session.createTopic(TOPIC_NAME);
通过session会话对象建立消费(要与目的地建立联系)
MessageConsumer consumer = session.createConsumer(topic);
消费消息
// 采用的是Lambda表达式,因为接口里只有一个方法 consumer.setMessageListener(message -> { if (message != null && message instanceof TextMessage) { TextMessage textMessage = (TextMessage) message; try { System.out.println("监听器接受到的消息:" + textMessage.getText()); } catch (JMSException e) { e.printStackTrace(); } } });
释放资源
// 异步非阻塞需要等待 System.in.read(); consumer.close(); session.close(); connection.close();
此时,监控信息情况如下:
消费者:3
消息入队:3
消息出队:9(消费者*消息入队)