原文: https://howtodoinjava.com/jms/jms-publish-subscribe-message-example/

JMS 教程中,您将了解有关 JMS 消息传递域“点对点域”和“发布订阅域”的信息。 在此示例中,我们将通过发布/订阅消息传递域这样的示例。 发布/订阅消息传递域是一对多模型,其中一个发布者通过topic向所有活动的订阅者发送消息,并且他们通过主题接收消息。

JMS 发布/订阅消息示例 - 图1

发布订阅 JMS 消息传递

发布/订阅消息发布者应用流程

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

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

让我们看下面的例子:

  1. package pubSub;
  2. import javax.naming.InitialContext;
  3. import javax.jms.Topic;
  4. import javax.jms.Session;
  5. import javax.jms.TextMessage;
  6. import javax.jms.TopicPublisher;
  7. import javax.jms.DeliveryMode;
  8. import javax.jms.TopicSession;
  9. import javax.jms.TopicConnection;
  10. import javax.jms.TopicConnectionFactory;
  11. public class Publisher
  12. {
  13. public static void main(String[] args) throws Exception
  14. {
  15. // get the initial context
  16. InitialContext ctx = new InitialContext();
  17. // lookup the topic object
  18. Topic topic = (Topic) ctx.lookup("topic/topic0");
  19. // lookup the topic connection factory
  20. TopicConnectionFactory connFactory = (TopicConnectionFactory) ctx.
  21. lookup("topic/connectionFactory");
  22. // create a topic connection
  23. TopicConnection topicConn = connFactory.createTopicConnection();
  24. // create a topic session
  25. TopicSession topicSession = topicConn.createTopicSession(false,
  26. Session.AUTO_ACKNOWLEDGE);
  27. // create a topic publisher
  28. TopicPublisher topicPublisher = topicSession.createPublisher(topic);
  29. topicPublisher.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
  30. // create the "Hello World" message
  31. TextMessage message = topicSession.createTextMessage();
  32. message.setText("Hello World");
  33. // publish the messages
  34. topicPublisher.publish(message);
  35. // print what we did
  36. System.out.println("Message published: " + message.getText());
  37. // close the topic connection
  38. topicConn.close();
  39. }
  40. }

发布/订阅消息订阅者应用流程

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

  1. package pubSub;
  2. import javax.naming.InitialContext;
  3. import javax.jms.Topic;
  4. import javax.jms.Session;
  5. import javax.jms.TextMessage;
  6. import javax.jms.TopicSession;
  7. import javax.jms.TopicSubscriber;
  8. import javax.jms.TopicConnection;
  9. import javax.jms.TopicConnectionFactory;
  10. public class Subscriber
  11. {
  12. public static void main(String[] args) throws Exception
  13. {
  14. // get the initial context
  15. InitialContext ctx = new InitialContext();
  16. // lookup the topic object
  17. Topic topic = (Topic) ctx.lookup("topic/topic0");
  18. // lookup the topic connection factory
  19. TopicConnectionFactory connFactory = (TopicConnectionFactory) ctx.
  20. lookup("topic/connectionFactory");
  21. // create a topic connection
  22. TopicConnection topicConn = connFactory.createTopicConnection();
  23. // create a topic session
  24. TopicSession topicSession = topicConn.createTopicSession(false,
  25. Session.AUTO_ACKNOWLEDGE);
  26. // create a topic subscriber
  27. TopicSubscriber topicSubscriber = topicSession.createSubscriber(topic);
  28. // start the connection
  29. topicConn.start();
  30. // receive the message
  31. TextMessage message = (TextMessage) topicSubscriber.receive();
  32. // print the message
  33. System.out.println("Message received: " + message.getText());
  34. // close the topic connection
  35. topicConn.close();
  36. }
  37. }

在上面的代码中,接收方将接收来自发送方的消息并进行打印,即 HelloWorld。

学习愉快!