Topic主题发布和订阅消息
根据前文介绍的消息传递都是点对点的消息,即一个生产者发送的一条消息只能被一个消费者消费,然后就移除了。
而topic模式一条消息可以被多个消费者订阅,关系如下:
定义生产者
public class TopicPublisherDemo {
//创建 activemq 的连接账号
private static String userName = "admin";
//创建 activemq 的连接密码
private static String password = "admin";
// activemq 基于 tcp 协议的链接地址 端口默认为 61616
private static String brokerURL = "tcp://192.168.111.161:61616";
public static void main(String[] args) throws Exception {
TopicConnectionFactory factory = new ActiveMQConnectionFactory(userName,password,brokerURL);
TopicConnection connection = factory.createTopicConnection();
connection.start();
TopicSession session = connection.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);
Topic topic = session.createTopic("topic--hello");
TopicPublisher publisher = session.createPublisher(topic);
publisher.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
MapMessage message = session.createMapMessage();
message.setString("name","zmf");
message.setString("address","深圳");
publisher.publish(message);
publisher.close();
session.close();
connection.close();
}
}
启动后,我们可以看到如下:
定义消费者
public class TopicSubscriberDemo {
//创建 activemq 的连接账号
private static String userName = "admin";
//创建 activemq 的连接密码
private static String password = "admin";
// activemq 基于 tcp 协议的链接地址 端口默认为 61616
private static String brokerURL = "tcp://192.168.111.161:61616";
public static void main(String[] args) throws Exception {
TopicConnectionFactory factory = new ActiveMQConnectionFactory(userName,password,brokerURL);
TopicConnection connection = factory.createTopicConnection();
connection.start();
TopicSession session = connection.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);
Topic topic = session.createTopic("topic--hello");
TopicSubscriber subscriber = session.createSubscriber(topic);
subscriber.setMessageListener(new MessageListener() {
public void onMessage(Message message) {
try {
if (message instanceof TextMessage) {
System.out.println("获取的信息:" + ((TextMessage) message).getText());
} else if (message instanceof ObjectMessage) {
System.out.println("获取的信息:" + ((ObjectMessage) message).getObject());
}else if (message instanceof MapMessage){
String name = ((MapMessage) message).getString("name");
String address = ((MapMessage) message).getString("address");
System.out.println(name + ": " + address);
}
} catch (JMSException e) {
e.printStackTrace();
}
}
});
Thread.sleep(Long.MAX_VALUE);
subscriber.close();
session.close();
connection.close();
}
}
启动后,从浏览器看到如下:
后台获取数据如下: