💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
# JMS 发布/订阅消息示例 > 原文: [https://howtodoinjava.com/jms/jms-publish-subscribe-message-example/](https://howtodoinjava.com/jms/jms-publish-subscribe-message-example/) 在 [JMS 教程](//howtodoinjava.com/jms/jms-java-message-service-tutorial/)中,您将了解有关 JMS 消息传递域“点对点域”和“发布订阅域”的信息。 在此示例中,我们将通过**发布/订阅消息传递域**这样的示例。 发布/订阅消息传递域是**一对多模型**,其中一个发布者通过`topic`向所有活动的订阅者发送消息,并且他们通过主题接收消息。 ![Publish Subscribe JMS Messaging](https://img.kancloud.cn/2c/ef/2cefa960a95893c306d683274379ca19_402x164.png) 发布订阅 JMS 消息传递 ## 发布/订阅消息发布者应用流程 下面给出了发送方应用的典型发布/订阅消息传递示例。 该应用的以下步骤是: 1. 首先,我们将获取 JMS 服务器的`InitialContext`对象。 2. 之后,使用初始上下文对象查找主题对象。 3. 同样,我们将使用初始上下文对象查找主题连接工厂。 4. 然后,使用主题连接工厂来创建主题连接,因为它表示 JMS 服务器的物理连接。 5. 创建主题连接工厂后,我们将创建主题会话,在该会话中,第一个参数将决定该会话是否被处理。 但是,我们将使用非事务会话,而第二个参数确定传递模式。 6. 之后,我们将为主题对象创建一个主题发布者,然后创建一条消息。 7. 然后将诸如“`Hello`”之类的消息发送到主题对象。 8. 关闭主题连接后,关闭主题连接后,它将自动关闭会话和主题发布者。 让我们看下面的例子: ```java 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 context InitialContext ctx = new InitialContext(); // lookup the topic object Topic topic = (Topic) ctx.lookup("topic/topic0"); // lookup the topic connection factory TopicConnectionFactory connFactory = (TopicConnectionFactory) ctx. lookup("topic/connectionFactory"); // create a topic connection TopicConnection topicConn = connFactory.createTopicConnection(); // create a topic session TopicSession topicSession = topicConn.createTopicSession(false, Session.AUTO_ACKNOWLEDGE); // create a topic publisher TopicPublisher topicPublisher = topicSession.createPublisher(topic); topicPublisher.setDeliveryMode(DeliveryMode.NON_PERSISTENT); // create the "Hello World" message TextMessage message = topicSession.createTextMessage(); message.setText("Hello World"); // publish the messages topicPublisher.publish(message); // print what we did System.out.println("Message published: " + message.getText()); // close the topic connection topicConn.close(); } } ``` ## 发布/订阅消息订阅者应用流程 接收方的大多数步骤与发送方应用相同 – 除了它将监听消息而不是发送 JMS 消息外。 ```java 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 context InitialContext ctx = new InitialContext(); // lookup the topic object Topic topic = (Topic) ctx.lookup("topic/topic0"); // lookup the topic connection factory TopicConnectionFactory connFactory = (TopicConnectionFactory) ctx. lookup("topic/connectionFactory"); // create a topic connection TopicConnection topicConn = connFactory.createTopicConnection(); // create a topic session TopicSession topicSession = topicConn.createTopicSession(false, Session.AUTO_ACKNOWLEDGE); // create a topic subscriber TopicSubscriber topicSubscriber = topicSession.createSubscriber(topic); // start the connection topicConn.start(); // receive the message TextMessage message = (TextMessage) topicSubscriber.receive(); // print the message System.out.println("Message received: " + message.getText()); // close the topic connection topicConn.close(); } } ``` 在上面的代码中,接收方将接收来自发送方的消息并进行打印,即 HelloWorld。 学习愉快!