首页 > 解决方案 > JMS 发布/订阅问题

问题描述

我是使用 Spring boot 和 Apache Active MQ 的 JMS pub/sub 新手。您能否帮助理解以下场景?

场景一:

第 1 步:我有一个发布者将消息(例如 MessageA)发布到主题(Say TopicA),并且在发布期间没有订阅者/消费者,因此消息会发送到 Apache Active MQ 中排队的消息。

Step2:我现在有一个TopicA的新订阅者,如何声明已经在Apache Active MQ中排队的早期MessageA?

我的结论:之前没有人订阅,因此您可能不会收到 MessageA。(如果我错了请指正)

场景二:

第 1 步:我有一个发布者将消息(Say MessageA)发布到主题(Say TopicA),并且订阅者成功获得了 MessageA。

Step2:现在订阅者系统由于一些内部/网络问题而关闭,并且有一个 MessageA 发布到 TopicA。当订阅者系统启动并运行时,如何回收订阅者系统关闭时发布到 TopicA 的早期 MessageA?

这是为了确保即使订阅者发生故障转移,它仍然会收到 Enqueued 消息。

感谢您的编辑!在经过同行评审之前,只有您可以看到此编辑。

我是使用 Spring boot 和 Apache Active MQ 的 JMS pub/sub 新手。您能否帮助理解以下场景?

场景一:

第 1 步:我有一个发布者将消息(例如 MessageA)发布到主题(Say TopicA),并且在发布期间没有订阅者/消费者,因此消息会发送到 Apache Active MQ 中排队的消息。

Step2:我现在有一个TopicA的新订阅者,如何声明已经在Apache Active MQ中排队的早期MessageA?

我的结论:之前没有人订阅,因此您可能不会收到 MessageA。(如果我错了请指正)

场景二:

第 1 步:我有一个发布者将消息(Say MessageA)发布到主题(Say TopicA),并且订阅者成功获得了 MessageA。

Step2:现在订阅者系统由于一些内部/网络问题而关闭,并且有一个 MessageA 发布到 TopicA。当订阅者系统启动并运行时,如何回收订阅者系统关闭时发布到 TopicA 的早期 MessageA?

这是为了确保即使订阅者发生故障转移,它仍然会收到 Enqueued 消息。

我的生产者代码:

@Bean
public JmsTemplate jmsTemplate(){
    JmsTemplate template = new JmsTemplate();
    template.setConnectionFactory(connectionFactory());
    template.setPubSubDomain(true);
    template.setDeliveryMode(DeliveryMode.PERSISTENT);
    return template;
}

我的消费者代码:

@Bean
public JmsListenerContainerFactory<?> jsaFactory(ConnectionFactory connectionFactory,
                                                DefaultJmsListenerContainerFactoryConfigurer configurer) {
    DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
    factory.setPubSubDomain(true);
    factory.setSubscriptionDurable(true);
    configurer.configure(factory, connectionFactory);
    return factory;
}
 

 </p>

标签: javaspring-bootjmspublish-subscribejms-topic

解决方案


您需要创建一个持久订阅:

MessageConsumer consumer = session.createDurableSubscriber(destination, "Listener" + i);

消息生产者必须是持久的:

messageProducer.setDeliveryMode(DeliveryMode.PERSISTENT);

推荐阅读