# 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](img/4f8be82ddadbab37115d9ed981df7021.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。

学习愉快！