持久侦听器/使用者的用例场景

时间:2017-09-29 14:25:21

标签: java spring-boot spring-jms durable-subscription

因此,我正在为一个主题创建并发使用者,即多个侦听器。我正在配置它们是耐用的。

@Bean
public DefaultMessageListenerContainer listenerContainers() {
    DefaultMessageListenerContainer container = new DefaultMessageListenerContainer();
    container.setConnectionFactory(connectionFactory());
    container.setDestinationName(COMMENT_QUEUE);
    container.setPubSubDomain(true);
    container.setSessionTransacted(true);
    container.setConcurrentConsumers(2);
    container.setSubscriptionDurable(true);
    container.setMessageListener(datafileSubscriber);
    container.start();
    return container;
} 

我认为持久消费者的用例场景是

我有一个发布消息的进程,并且侦听器会接收消息。我在想是否有人停止了这个过程,我又重新开始了,我不会因为持久的消费者而失去信息和处理。

是吗?

我不会丢失消息,因为消息在KahaDB中,并且在重新启动进程后,它将重新发送尚未完全处理给侦听器的消息,因为它们是持久的。 这是正确的解释吗?

1 个答案:

答案 0 :(得分:1)

这是正确的;默认情况下,主题订阅不是持久的;只有订阅者主动消费获取消息。新消费者只会在订阅时发布新消息。

持久的消费者更像是一个队列;经纪人跟踪他们并保持信息,直到所有这些消费者都收到它们。

订阅仅在建立时变得持久。如果经纪人不知道,则不会保留消息。因此,在发布任何消息之前建立持久订阅非常重要。