原文: https://howtodoinjava.com/jms/jms-publish-subscribe-message-example/
在 JMS 教程中,您将了解有关 JMS 消息传递域“点对点域”和“发布订阅域”的信息。 在此示例中,我们将通过发布/订阅消息传递域这样的示例。 发布/订阅消息传递域是一对多模型,其中一个发布者通过topic向所有活动的订阅者发送消息,并且他们通过主题接收消息。

发布订阅 JMS 消息传递
发布/订阅消息发布者应用流程
下面给出了发送方应用的典型发布/订阅消息传递示例。 该应用的以下步骤是:
- 首先,我们将获取 JMS 服务器的
InitialContext对象。 - 之后,使用初始上下文对象查找主题对象。
- 同样,我们将使用初始上下文对象查找主题连接工厂。
- 然后,使用主题连接工厂来创建主题连接,因为它表示 JMS 服务器的物理连接。
- 创建主题连接工厂后,我们将创建主题会话,在该会话中,第一个参数将决定该会话是否被处理。 但是,我们将使用非事务会话,而第二个参数确定传递模式。
- 之后,我们将为主题对象创建一个主题发布者,然后创建一条消息。
- 然后将诸如“
Hello”之类的消息发送到主题对象。 - 关闭主题连接后,关闭主题连接后,它将自动关闭会话和主题发布者。
让我们看下面的例子:
package pubSub;import javax.naming.InitialContext;import javax.jms.Topic;import javax.jms.Session;import javax.jms.TextMessage;import javax.jms.TopicPublisher;import javax.jms.DeliveryMode;import javax.jms.TopicSession;import javax.jms.TopicConnection;import javax.jms.TopicConnectionFactory;public class Publisher{public static void main(String[] args) throws Exception{// get the initial contextInitialContext ctx = new InitialContext();// lookup the topic objectTopic topic = (Topic) ctx.lookup("topic/topic0");// lookup the topic connection factoryTopicConnectionFactory connFactory = (TopicConnectionFactory) ctx.lookup("topic/connectionFactory");// create a topic connectionTopicConnection topicConn = connFactory.createTopicConnection();// create a topic sessionTopicSession topicSession = topicConn.createTopicSession(false,Session.AUTO_ACKNOWLEDGE);// create a topic publisherTopicPublisher topicPublisher = topicSession.createPublisher(topic);topicPublisher.setDeliveryMode(DeliveryMode.NON_PERSISTENT);// create the "Hello World" messageTextMessage message = topicSession.createTextMessage();message.setText("Hello World");// publish the messagestopicPublisher.publish(message);// print what we didSystem.out.println("Message published: " + message.getText());// close the topic connectiontopicConn.close();}}
发布/订阅消息订阅者应用流程
接收方的大多数步骤与发送方应用相同 – 除了它将监听消息而不是发送 JMS 消息外。
package pubSub;import javax.naming.InitialContext;import javax.jms.Topic;import javax.jms.Session;import javax.jms.TextMessage;import javax.jms.TopicSession;import javax.jms.TopicSubscriber;import javax.jms.TopicConnection;import javax.jms.TopicConnectionFactory;public class Subscriber{public static void main(String[] args) throws Exception{// get the initial contextInitialContext ctx = new InitialContext();// lookup the topic objectTopic topic = (Topic) ctx.lookup("topic/topic0");// lookup the topic connection factoryTopicConnectionFactory connFactory = (TopicConnectionFactory) ctx.lookup("topic/connectionFactory");// create a topic connectionTopicConnection topicConn = connFactory.createTopicConnection();// create a topic sessionTopicSession topicSession = topicConn.createTopicSession(false,Session.AUTO_ACKNOWLEDGE);// create a topic subscriberTopicSubscriber topicSubscriber = topicSession.createSubscriber(topic);// start the connectiontopicConn.start();// receive the messageTextMessage message = (TextMessage) topicSubscriber.receive();// print the messageSystem.out.println("Message received: " + message.getText());// close the topic connectiontopicConn.close();}}
在上面的代码中,接收方将接收来自发送方的消息并进行打印,即 HelloWorld。
学习愉快!
