【问题标题】:JMS Pub/Sub QuestionsJMS 发布/订阅问题
【发布时间】:2018-12-18 06:51:15
【问题描述】:

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

场景 1:

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

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

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

场景 2:

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

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

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

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

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

场景 1:

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

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

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

场景 2:

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

步骤 2:现在订阅者系统由于一些内部/网络问题而关闭,并且有一个 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;
}
 

【问题讨论】:

    标签: java spring-boot jms publish-subscribe jms-topic


    【解决方案1】:

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

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

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

    messageProducer.setDeliveryMode(DeliveryMode.PERSISTENT);
    

    【讨论】:

    • 需要在JMSListener中设置吗?
    • 请在 Spring Boot 中找到我上面更新的生产者和消费者代码 sn-p。我已经添加了您的建议,但它仍然对我不起作用。请指教。
    • 对不起,我没有安装activemq和spring boot。您应该考虑创建能够重现您的问题的示例应用程序。
    猜你喜欢
    • 2016-06-17
    • 1970-01-01
    • 2016-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多