因此,我正在为一个主题创建并发消费者,即多个监听器。我将它们配置为耐用。
@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 中,并且在进程重新启动后,它会将尚未完全处理的消息重新发送给监听器,因为它们是持久的。 这是正确的解释吗?
最佳答案
这是正确的;主题订阅默认不持久;只有主动消费的订阅者才能获取消息。新消费者只会在订阅时收到发布的新消息。
持久消费者的行为更像是一个队列;代理会跟踪它们并保留消息,直到所有此类消费者都收到它们。
订阅只有在建立后才变得持久。如果代理不知道这一点,则不会保留消息。因此,在发布任何消息之前建立持久订阅非常重要。
关于java - 持久监听器/消费者的用例场景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46490934/