# JMS 点对点消息示例

> 原文： [https://howtodoinjava.com/jms/jms-point-to-point-message-example/](https://howtodoinjava.com/jms/jms-point-to-point-message-example/)

在 [JMS 教程](//howtodoinjava.com/jms/jms-java-message-service-tutorial/)中，您了解了 JMS 消息传递域点对点域和[发送订阅域](//howtodoinjava.com/jms/jms-publish-subscribe-message-example)。 在此示例中，我们将通过点对点消息传递域进行示例。 在点对点消息中，发送方将消息传递到队列，**单个接收方从队列**中取出消息。 接收者在发送消息时不需要监听队列。

![Point to point JMS Messaging](img/bc73b3600c6fbf951c9ae14c7b6445b3.png)

点对点 JMS 消息传递



## 点对点消息发布者应用流程

下面给出了发送方应用的典型点对点消息传递示例。 该应用的以下步骤是：

1.  首先，我们将获取 JMS 服务器的`InitialContext`对象。
2.  之后，使用初始上下文对象查找队列对象。
3.  同样，我们将使用初始上下文对象来查找队列连接工厂。
4.  然后，使用队列连接工厂来创建队列连接，因为它表示 JMS 服务器的物理连接。
5.  创建队列连接工厂后，我们将创建队列会话，其中第一个参数将决定会话是否被事务处理。 但是，我们将使用非事务会话。
6.  此后，为队列创建一个队列发送者，然后创建一条消息。
7.  然后将诸如“`Hello World`”之类的消息发送到队列对象。
8.  关闭队列连接后，关闭队列连接后，它将自动关闭会话和队列发送者。

让我们看下面的例子：

```java
package pointToPoint;                                                                      
import javax.naming.InitialContext;

import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.QueueSender;
import javax.jms.DeliveryMode;
import javax.jms.QueueSession;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;

public class Sender
{
    public static void main(String[] args) throws Exception
    {
       // get the initial context
       InitialContext context = new InitialContext();

       // lookup the queue object
       Queue queue = (Queue) context.lookup("queue/queue0");

       // lookup the queue connection factory
       QueueConnectionFactory conFactory = (QueueConnectionFactory) context.lookup ("queue/connectionFactory");

       // create a queue connection
       QueueConnection queConn = conFactory.createQueueConnection();

       // create a queue session
       QueueSession queSession = queConn.createQueueSession(false, Session.DUPS_OK_ACKNOWLEDGE);

       // create a queue sender
       QueueSender queSender = queSession.createSender(queue);
       queueSender.setDeliveryMode(DeliveryMode.NON_PERSISTENT);

       // create a simple message to say "Hello World"
       TextMessage message = queSession.createTextMessage("Hello World");

       // send the message
       queSender.send(message);

       // print what we did
       System.out.println("Message Sent: " + message.getText());

       // close the queue connection
       queConn.close();
    }
}

```

## 点对点消息传递订阅者应用流程

接收方的大多数步骤与发送方应用相同 – 除了它将监听消息而不是发送 JMS 消息外。

```java
package pointToPoint;
import javax.naming.InitialContext;                                                                        
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.QueueSession;
import javax.jms.QueueReceiver;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;

public class Receiver
{
    public static void main(String[] args) throws Exception
    {
       // get the initial context
       InitialContext context = new InitialContext();

      // lookup the queue object
       Queue queue = (Queue) context.lookup("queue/queue0");

       // lookup the queue connection factory
       QueueConnectionFactory conFactory = (QueueConnectionFactory) context.lookup ("queue/connectionFactory");

       // create a queue connection
       QueueConnection queConn = conFactory.createQueueConnection();

       // create a queue session
       QueueSession queSession = queConn.createQueueSession(false,   
       Session.AUTO_ACKNOWLEDGE);

       // create a queue receiver
       QueueReceiver queReceiver = queSession.createReceiver(queue);

       // start the connection
       queConn.start();

       // receive a message
       TextMessage message = (TextMessage) queueReceiver.receive();

       // print the message
       System.out.println("Message Received: " + message.getText());

       // close the queue connection
       queConn.close();
    }
}

```

在上面的代码中，接收方将接收来自发送方的消息并进行打印，即 HelloWorld。 但是，如果未启动连接，则方法接收器将被阻塞，直到其他任何线程启动连接为止。

学习愉快！