java - 持久监听器/消费者的用例场景

标签 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 中,并且在进程重新启动后,它会将尚未完全处理的消息重新发送给监听器,因为它们是持久的。 这是正确的解释吗?

最佳答案

这是正确的;主题订阅默认不持久;只有主动消费的订阅者才能获取消息。新消费者只会在订阅时收到发布的新消息。

持久消费者的行为更像是一个队列;代理会跟踪它们并保留消息,直到所有此类消费者都收到它们。

订阅只有在建立后才变得持久。如果代理不知道这一点,则不会保留消息。因此,在发布任何消息之前建立持久订阅非常重要。

关于java - 持久监听器/消费者的用例场景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46490934/

相关文章:

java - 保持 JMS session 始终处于 Activity 状态

java - 我没有在 java 中获取 jsonArray?

java - Spark on HBase 异常类未找到(JAVA)

java - 特定环境的spring yml文件

jms - Apache Camel 多个 JMS 监听器

java - Spring JMS - 指数消息重新传递策略被忽略

java - 在一群程序员之间共享新版本 Java 源代码的最佳方式是什么?

java - 获取在 jpanel 上单击的顶点的索引

java - Jasypt 无法使用 Spring 从系统环境变量中解密密码

spring-boot - 使用 NativeSearchQuery 从 Elasticsearch 查询数据时出现问题