多个持久的侦听器。他们同时工作吗?

时间:2017-10-03 16:24:41

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

我的配置:

@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。这是一个pub / sub模型。

我的想法是,如果一个侦听器将执行代码。其他听众只需发送确认即可发送。这样他们就可以获得另一条消息。

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

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

我认为这个概念是每个监听器都会在代理中维护一个队列。当代理获取消息时,它会将消息推送到 每个听众的队列。如果监听器空闲,它将接收消息。如果正忙于处理,则在发送确认之前,该消息 将留在队列中。确认后,下一条消息将被发送给监听器。

我只是在我拥有的属性,持久订阅者,setsession交易真实的背景下说这个。

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

编辑: 我在这里说的一切都是在我的配置环境中使用持久订阅者,setsessiontransacted true和相同的消息监听器

1 个答案:

答案 0 :(得分:2)

  

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

它根本不工作,消费者/订阅彼此独立。没有"队列"为每个用户;只是主题;通过持久订阅,代理会跟踪发送给消费者的最后一条消息;当所有持久订阅都收到该消息时,它将被删除。

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

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

  

并发消费者财产到2

正如我在回答你的另一个问题时所说的那样,当从主题中消费时,增加并发性是没有意义的。