我的配置:
@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和相同的消息监听器
答案 0 :(得分:2)
我的假设:经纪人向两个听众发送消息。其中一个立即承认,而另一个处理它。 现在经纪人收到了另一条消息。由于第一个侦听器没有发送确认,它会将消息发送到第二个侦听器,并将消息放入第一个侦听器的队列中,以便每当第一个侦听器确认上一条消息时它就可以发送。
它根本不工作,消费者/订阅彼此独立。没有"队列"为每个用户;只是主题;通过持久订阅,代理会跟踪发送给消费者的最后一条消息;当所有持久订阅都收到该消息时,它将被删除。
将消息发送给消费者的实际过程取决于其他因素,例如,ActiveMQ支持预取(默认为1000),这意味着它将发送到该号码而无需等待确认。
您必须将sessionTransacted与DMLC一起使用,以便在您的侦听器完成之前不会提交确认。
并发消费者财产到2
正如我在回答你的另一个问题时所说的那样,当从主题中消费时,增加并发性是没有意义的。