上一章实现了点对点的消息模式,接下来试着实现一下主题模式。
两者代码大致相同,但却让我纠结了好久才成功。
首先要理解一下主题模式的概念:
同样是发布者和消费者,这里发布者将消息发布到一个主题下,这时,订阅了这个主题的消费者就能接收到发布的消息。
简单来说,就像是订阅杂志,从你订阅杂志开始,你就能收到接下来出的杂志,但你肯定收不到之前已经发布的杂志。
这是与队列不同的地方,队列类似把消息放到一个地方,等着消费者过来取,取走了就没了,只有一份;主题是把消息复制发送给所有订阅了的消费者,只发送一次,所以后订阅的收不到这个消息。
以上是我的理解,有错误的地方请指正,谢谢。
接下来就是代码:
发布者的代码基本相同,唯一改变的地方是建立地址:
这里用的是createTopic方法,因为使用的是主题模式。
然后需要一个监听器,相当于帮助消费者订阅主题的:
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
public class MyMessageListener implements MessageListener {
@Override
public void onMessage(Message message) {
try {
System.out.println("topic message" + ((TextMessage) message).getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
}
然后就是消费者的代码,同样修改不是很大:
这里修改了两个地方,一个是创建地址改为创建主题。另一个是将接收消息的操作交给监听器执行。
代码写好以后,先运行消费者类,然后运行发布者类。
在控制台可以看到输出:
我这里用了三个线程进行测试,可以看到三个消费者都分别拿到了消息数据。