📜  JMS 中 PointToPoint 和发布订阅模型的区别(1)

📅  最后修改于: 2023-12-03 15:02:08.360000             🧑  作者: Mango

JMS 中 Point-to-Point 和发布订阅模型的区别

在 JMS 中,有两种主要的消息传递模型:Point-to-Point(点对点)和发布订阅(Pub-Sub)。

Point-to-Point(点对点)

Point-to-Point 模型适合于一对一的消息传递。在此模型中,一个消息发送者发送一条消息到一个消息队列中。一个消息接收者从相同队列中接收消息,并负责处理该消息。在 Point-to-Point 模型中,消息只会被一个消息接收者接收并处理,而且消息接收者只能按照消息在队列中的顺序接收消息。

Point-to-Point 模型的主要特点包括:

  • 发送者和接收者之间的异步通信;
  • 发送者和接收者之间是一对一的关系;
  • 接收者只有在监听了队列并从中取出消息时才会收到消息。

下面是 Java Spring Boot 实现 Point-to-Point 模型的示例代码:

@Component
public class MessageSender {

    @Autowired
    private JmsTemplate jmsTemplate;

    @Value("${jms.queue-name}")
    private String queueName;

    public void sendMessage(String message) {
        jmsTemplate.send(queueName, new MessageCreator() {
            @Override
            public Message createMessage(Session session) throws JMSException {
                return session.createTextMessage(message);
            }
        });
    }
}

@Component
public class MessageReceiver implements MessageListener {

    @Autowired
    private ObjectMapper objectMapper;

    @Override
    public void onMessage(Message message) {
        try {
            String messageBody = ((TextMessage) message).getText();
            MessagePayload payload = objectMapper.readValue(messageBody, MessagePayload.class);
            // process the payload
        } catch (JMSException | IOException e) {
            e.printStackTrace();
        }
    }
}
发布订阅(Pub-Sub)

与 Point-to-Point 模型相反,发布订阅模型适合于一对多的消息传递。在此模型中,一个消息发送者发送一条消息到一个 Topic(主题)中。多个消息接收者从相同 Topic 中接收消息,并都可以处理该消息。在发布订阅模型中,消息可以被多个接收者接收并处理,而且消息接收者可以异步地接收消息。

发布订阅模型的主要特点包括:

  • 发送者和接收者之间的异步通信;
  • 发送者和接收者之间是一对多的关系;
  • 接收者在监听 Topic 时会实时收到发布到该 Topic 的所有消息。

下面是 Java Spring Boot 实现发布订阅模型的示例代码:

@Component
public class MessagePublisher {

    @Autowired
    private JmsTemplate jmsTemplate;

    @Value("${jms.topic-name}")
    private String topicName;

    public void publishMessage(String message) {
        jmsTemplate.send(topicName, new MessageCreator() {
            @Override
            public Message createMessage(Session session) throws JMSException {
                return session.createTextMessage(message);
            }
        });
    }
}

@Component
public class MessageSubscriber implements MessageListener {

    @Autowired
    private ObjectMapper objectMapper;

    @Override
    public void onMessage(Message message) {
        try {
            String messageBody = ((TextMessage) message).getText();
            MessagePayload payload = objectMapper.readValue(messageBody, MessagePayload.class);
            // process the payload
        } catch (JMSException | IOException e) {
            e.printStackTrace();
        }
    }
}
总结

Point-to-Point 和发布订阅模型都是非常常见的消息传递模型,它们分别适合于一对一和一对多的消息传递场景。开发者需要通过分析业务需求来选择合适的模型,以实现高效的消息传递。