原文: https://howtodoinjava.com/jms/jms-point-to-point-message-example/

JMS 教程中,您了解了 JMS 消息传递域点对点域和发送订阅域。 在此示例中,我们将通过点对点消息传递域进行示例。 在点对点消息中,发送方将消息传递到队列,单个接收方从队列中取出消息。 接收者在发送消息时不需要监听队列。

JMS 点对点消息示例 - 图1

点对点 JMS 消息传递

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

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

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

让我们看下面的例子:

  1. package pointToPoint;
  2. import javax.naming.InitialContext;
  3. import javax.jms.Queue;
  4. import javax.jms.Session;
  5. import javax.jms.TextMessage;
  6. import javax.jms.QueueSender;
  7. import javax.jms.DeliveryMode;
  8. import javax.jms.QueueSession;
  9. import javax.jms.QueueConnection;
  10. import javax.jms.QueueConnectionFactory;
  11. public class Sender
  12. {
  13. public static void main(String[] args) throws Exception
  14. {
  15. // get the initial context
  16. InitialContext context = new InitialContext();
  17. // lookup the queue object
  18. Queue queue = (Queue) context.lookup("queue/queue0");
  19. // lookup the queue connection factory
  20. QueueConnectionFactory conFactory = (QueueConnectionFactory) context.lookup ("queue/connectionFactory");
  21. // create a queue connection
  22. QueueConnection queConn = conFactory.createQueueConnection();
  23. // create a queue session
  24. QueueSession queSession = queConn.createQueueSession(false, Session.DUPS_OK_ACKNOWLEDGE);
  25. // create a queue sender
  26. QueueSender queSender = queSession.createSender(queue);
  27. queueSender.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
  28. // create a simple message to say "Hello World"
  29. TextMessage message = queSession.createTextMessage("Hello World");
  30. // send the message
  31. queSender.send(message);
  32. // print what we did
  33. System.out.println("Message Sent: " + message.getText());
  34. // close the queue connection
  35. queConn.close();
  36. }
  37. }

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

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

  1. package pointToPoint;
  2. import javax.naming.InitialContext;
  3. import javax.jms.Queue;
  4. import javax.jms.Session;
  5. import javax.jms.TextMessage;
  6. import javax.jms.QueueSession;
  7. import javax.jms.QueueReceiver;
  8. import javax.jms.QueueConnection;
  9. import javax.jms.QueueConnectionFactory;
  10. public class Receiver
  11. {
  12. public static void main(String[] args) throws Exception
  13. {
  14. // get the initial context
  15. InitialContext context = new InitialContext();
  16. // lookup the queue object
  17. Queue queue = (Queue) context.lookup("queue/queue0");
  18. // lookup the queue connection factory
  19. QueueConnectionFactory conFactory = (QueueConnectionFactory) context.lookup ("queue/connectionFactory");
  20. // create a queue connection
  21. QueueConnection queConn = conFactory.createQueueConnection();
  22. // create a queue session
  23. QueueSession queSession = queConn.createQueueSession(false,
  24. Session.AUTO_ACKNOWLEDGE);
  25. // create a queue receiver
  26. QueueReceiver queReceiver = queSession.createReceiver(queue);
  27. // start the connection
  28. queConn.start();
  29. // receive a message
  30. TextMessage message = (TextMessage) queueReceiver.receive();
  31. // print the message
  32. System.out.println("Message Received: " + message.getText());
  33. // close the queue connection
  34. queConn.close();
  35. }
  36. }

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

学习愉快!