多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# 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](https://img.kancloud.cn/75/46/7546d00ef5bc984e08adee27896a2b3d_575x135.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。 但是,如果未启动连接,则方法接收器将被阻塞,直到其他任何线程启动连接为止。 学习愉快!