原文: https://howtodoinjava.com/jms/jms-point-to-point-message-example/
在 JMS 教程中,您了解了 JMS 消息传递域点对点域和发送订阅域。 在此示例中,我们将通过点对点消息传递域进行示例。 在点对点消息中,发送方将消息传递到队列,单个接收方从队列中取出消息。 接收者在发送消息时不需要监听队列。

点对点 JMS 消息传递
点对点消息发布者应用流程
下面给出了发送方应用的典型点对点消息传递示例。 该应用的以下步骤是:
- 首先,我们将获取 JMS 服务器的
InitialContext对象。 - 之后,使用初始上下文对象查找队列对象。
- 同样,我们将使用初始上下文对象来查找队列连接工厂。
- 然后,使用队列连接工厂来创建队列连接,因为它表示 JMS 服务器的物理连接。
- 创建队列连接工厂后,我们将创建队列会话,其中第一个参数将决定会话是否被事务处理。 但是,我们将使用非事务会话。
- 此后,为队列创建一个队列发送者,然后创建一条消息。
- 然后将诸如“
Hello World”之类的消息发送到队列对象。 - 关闭队列连接后,关闭队列连接后,它将自动关闭会话和队列发送者。
让我们看下面的例子:
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 contextInitialContext context = new InitialContext();// lookup the queue objectQueue queue = (Queue) context.lookup("queue/queue0");// lookup the queue connection factoryQueueConnectionFactory conFactory = (QueueConnectionFactory) context.lookup ("queue/connectionFactory");// create a queue connectionQueueConnection queConn = conFactory.createQueueConnection();// create a queue sessionQueueSession queSession = queConn.createQueueSession(false, Session.DUPS_OK_ACKNOWLEDGE);// create a queue senderQueueSender 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 messagequeSender.send(message);// print what we didSystem.out.println("Message Sent: " + message.getText());// close the queue connectionqueConn.close();}}
点对点消息传递订阅者应用流程
接收方的大多数步骤与发送方应用相同 – 除了它将监听消息而不是发送 JMS 消息外。
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 contextInitialContext context = new InitialContext();// lookup the queue objectQueue queue = (Queue) context.lookup("queue/queue0");// lookup the queue connection factoryQueueConnectionFactory conFactory = (QueueConnectionFactory) context.lookup ("queue/connectionFactory");// create a queue connectionQueueConnection queConn = conFactory.createQueueConnection();// create a queue sessionQueueSession queSession = queConn.createQueueSession(false,Session.AUTO_ACKNOWLEDGE);// create a queue receiverQueueReceiver queReceiver = queSession.createReceiver(queue);// start the connectionqueConn.start();// receive a messageTextMessage message = (TextMessage) queueReceiver.receive();// print the messageSystem.out.println("Message Received: " + message.getText());// close the queue connectionqueConn.close();}}
在上面的代码中,接收方将接收来自发送方的消息并进行打印,即 HelloWorld。 但是,如果未启动连接,则方法接收器将被阻塞,直到其他任何线程启动连接为止。
学习愉快!
