JMS发布/订阅问题

时间:2018-12-18 06:51:15

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

我是使用Spring Boot和Apache Active MQ刚接触JMS pub / sub的人。 您能否帮助您了解以下情况?

方案1:

步骤1:我有一个发布者,它向主题(Say TopicA)发布消息(Say MessageA),并且在发布期间没有订阅者/使用者,因此该消息将发送给Apache Active MQ中的已入队消息。

Step2:我现在有一个新的TopicA订阅者,如何声明早先的MessageA(已将消息放入Apache Active MQ中?)

我的结论:之前没有人订阅,因此您可能无法获得MessageA。 (如果我错了,请更正)

方案2:

第一步:我有一个发布者,它将消息(说MessageA)发布到主题(说TopicA),而订阅者成功获取了MessageA。

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

这是为了确保即使用户进行了故障转移,它仍然会接收入队消息。

感谢您的编辑! 除非经过同行评审,否则只有您才能看到此修改。

我是使用Spring Boot和Apache Active MQ刚接触JMS pub / sub的人。您能帮忙了解以下情况吗?

方案1:

步骤1:我有一个发布者,它向主题(Say TopicA)发布消息(Say MessageA),并且在发布期间没有订阅者/使用者,因此该消息将发送给Apache Active MQ中的已入队消息。

Step2:我现在有一个新的TopicA订阅者,如何声明早先的MessageA(已将消息放入Apache Active MQ中?)

我的结论:之前没有人订阅,因此您可能无法获得MessageA。 (如果我错了,请更正)

方案2:

第一步:我有一个发布者,它将消息(说MessageA)发布到主题(说TopicA),而订阅者成功获取了MessageA。

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

这是为了确保即使用户进行了故障转移,它仍然会接收入队消息。

我的生产者代码:

@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;
}
 

1 个答案:

答案 0 :(得分:0)

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

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

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

messageProducer.setDeliveryMode(DeliveryMode.PERSISTENT);