【发布时间】: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