【问题标题】:Multiple listeners that are durable. Do they work concurrently?多个持久的侦听器。他们同时工作吗?
【发布时间】:2017-10-03 16:24:41
【问题描述】:

我的配置:

@Bean
    public ActiveMQConnectionFactory connectionFactory(){
        ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory();
        connectionFactory.setBrokerURL(DEFAULT_BROKER_URL);
        return connectionFactory;
    }
 @Bean
    public DefaultMessageListenerContainer listenerContainers() {
        DefaultMessageListenerContainer container = new DefaultMessageListenerContainer();
        container.setConnectionFactory(connectionFactory());
        //container.setConnectionFactory(connectionFactory1());
        container.setClientId("consumer1");
        container.setDestinationName(COMMENT_QUEUE);
        container.setPubSubDomain(true);
        container.setSessionTransacted(true);
        container.setSubscriptionDurable(true);
        container.setMessageListener(datafileSubscriber);
        container.start();
        return container;
    }

    @Bean
    public DefaultMessageListenerContainer listenerContainers1() {
        DefaultMessageListenerContainer container = new DefaultMessageListenerContainer();
        container.setConnectionFactory(connectionFactory());
        container.setClientId("consumer2");
        container.setDestinationName(COMMENT_QUEUE);
        container.setPubSubDomain(true);
        container.setSessionTransacted(true);
        container.setSubscriptionDurable(true);
        container.setMessageListener(datafileSubscriber);
        container.start();
        return container;
    } 

我需要将消息发布给多个听众。所有的侦听器都执行相同的代码。我希望它们耐用。我已将 setsessiontransacted 设为 true。这是一个发布/订阅模型。

我的想法是,如果一个侦听器将执行代码。其他侦听器可以发送简单的确认。这样他们就可以收到另一条消息。

我在这里的假设: 代理向两个侦听器发送消息。其中一个立即确认,而另一个处理它。
现在经纪人收到了另一条消息。由于第一个监听器没有发送确认,它会将消息发送给第二个监听器 并将消息放入第一个侦听器的队列中,以便在第一个侦听器确认前一条消息时发送。

我的重要疑问: activemq 代理是否在所有侦听器均未确认的情况下发送另一条消息?

我认为这个概念是每个侦听器都将在代理中维护一个队列。当 broker 收到消息时,它会将消息推送到 每个单独的侦听器的队列。如果侦听器空闲,它将接收消息。如果它正忙于处理,直到发送确认,消息 将留在队列中。确认后,下一条消息将被传递给侦听器。

我只是在我拥有的属性、持久订阅者、setsession 交易为 true 的情况下这么说。

我尝试过但失败了。 我尝试将并发使用者属性设置为 2,并将其设置为持久订阅者。看起来如果它是一个持久订阅者,它需要一个 唯一的客户 ID。所以我转而使用具有并发消费者属性 1 的多个容器。

编辑: 我在这里所说的一切都是在我的配置上下文中使用的,它使用持久订阅者、setsessiontransacted true 和相同的消息侦听器

【问题讨论】:

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


    【解决方案1】:

    我在这里的假设:代理向两个侦听器发送一条消息。其中一个立即确认,而另一个处理它。 现在经纪人收到了另一条消息。由于第一个侦听器没有发送确认,它会将消息发送给第二个侦听器,并将消息放入第一个侦听器的队列中,以便在第一个侦听器确认之前的消息时发送。

    这种方式根本行不通,消费者/订阅是相互独立的。每个用户都没有“队列”;只是主题;通过持久订阅,代理可以跟踪发送给消费者的最后一条消息;当所有持久订阅都收到消息时,将其删除。

    向消费者发送消息的实际过程取决于其他因素,例如,ActiveMQ 支持预取(默认为 1000),这意味着它将发送最多该数量而无需等待确认。

    您必须将 sessionTransacted 与 DMLC 一起使用,以便在您的侦听器完成之前不会提交 ack。

    并发消费者属性为 2

    正如我在回答您的其他问题时所说,从主题消费时增加并发性毫无意义。

    【讨论】:

    • 加里,我设置了会话交易为真。请看一下配置。我的问题是,当代理收到其他消息时,如果侦听器尚未确认,会发生什么情况。这些消息去哪儿了?
    • 我正在尝试使用这种让多个侦听器执行相同代码的设计来替代多线程。
    • 您尝试做的事情对我来说毫无意义。多个消费者多线程,不是替代品。正如我所说,这周我真的没有空。我必须脱离这次谈话。如果您想再次尝试清楚地解释您的目标,我可能会重新加入。否则,既然我不明白你想要什么,也许其他人可以介入。
    猜你喜欢
    • 1970-01-01
    • 2010-11-19
    • 2023-04-06
    • 1970-01-01
    • 2011-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多