【问题标题】:How do durable subscribers work with JMS?持久订阅者如何与 JMS 一起工作?
【发布时间】:2018-03-09 16:36:52
【问题描述】:

所以我正在为一个主题创建并发消费者,即多个听众。我将它们配置为耐用。

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

我想知道的是,
让我们假设一个事件来了,它被发布给所有 5 个订阅者。其中一个处理它,因此在处理完成之前它不会立即确认,但剩下的 4 个会立即确认,因为它们处于空闲状态。

假设第二个事件发生了,现在

  1. 它是否发送给 4 个订阅者并将消息保留在第 5 个订阅者的队列中,并且只有在它给出确认后才将其发送给第 5 个订阅者?

                        OR
    
  2. 它不向任何消息订阅者发送消息,而是在队列中等待,直到第 5 个订阅者也确认,然后一次发送给所有订阅者?

我正在使用 setsessiontransacted true。 现在会发生什么 1 或 2 ? 此外,我假设代理为每个并发订阅者维护一个内部队列,以了解消息流向该持久订阅者的流向。

有人能解释一下该流程如何用于并发消费者、持久订阅和 setsessiontransacted=true 的配置吗?

【问题讨论】:

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


    【解决方案1】:

    消息提供者将在事件消息发布时将其放入订阅者的订阅队列中。订阅者从他们的订阅队列中提取(或使用监听器接收)这些消息。所以如果一个订阅者忙于处理事件消息,其他订阅者完全不受影响,他们将继续接收发布。事实上,订阅者不会知道其他订阅者的存在。

    【讨论】:

    • 我相信即使没有持久订阅者,只有普通订阅者,这种功能也不会改变,对吧?
    • 是的,订阅是否持久并不重要。
    猜你喜欢
    • 2013-12-17
    • 2017-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多