我遇到一个问题,即控制台中的Acpache ActiveMQ中的消息已出队,但没有调用具有@JmsListener的使用者方法,尽管使用者数量显示为7。
配置代码:
@Configuration
@EnableJms
public class JMSConfiguration {
private static final String DEFAULT_BROKER_URL = "tcp://localhost:61616";
private static final long DEFAULT_RECEIVE_TIMEOUT = 1000L;
private static final String DEFAULT_CONCURRENCY = "25";
@Bean
public ConnectionFactory connectionFactory() {
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory();
connectionFactory.setBrokerURL(DEFAULT_BROKER_URL);
return connectionFactory;
}
@Bean
public DefaultJmsListenerContainerFactory jmsListenerContainerFactory() {
DefaultJmsListenerContainerFactory listenerFactory = new DefaultJmsListenerContainerFactory();
listenerFactory.setConnectionFactory(connectionFactory());
listenerFactory.setReceiveTimeout(DEFAULT_RECEIVE_TIMEOUT);
listenerFactory.setConcurrency(DEFAULT_CONCURRENCY);
return listenerFactory;
}
@Bean
public JmsTemplate jmsTemplate() {
JmsTemplate template = new JmsTemplate();
template.setConnectionFactory(connectionFactory());
return template;
}
}
收听者代码:
@JmsListener(destination = Constants.EXPORT_QUEUE)
public void onExportMessageReceive(Message message) {
if (message instanceof Message) {
}
}
答案 0 :(得分:0)
我对使用4.3.22-RELEASE版本的spring-jms进行了更改。
现在它的工作方式如下: 最初,在应用程序中定义了3个使用者数和最多25个。现在,如果产生更多的消息,比如说25,那么消费者将仅剩下3,并且基于待处理消息,消费者的数量将逐渐增加。根据定义,它最多可以增加到13个,但最多不能创建25个。 因此,订单可能会更改。例如: Message1 Consumer1(进行中) Message2 Consumer2(进行中) Message3 Consumer3(进行中)
现在,如果这些消息正在处理中并且出现了新消息,则它们将按照以下说明等待使用者 Message4 Consumer1(正在等待) Message5 Consumer2(正在等待) Message6 Consumer3(正在等待)
现在,由于这些消息4-6处于待处理状态,并且新消息不断出现,这迫使系统创建新的使用者,因此这些消息将首先被使用。 Message7 Consumer4(进行中) Message8 Consumer5(进行中)
首先使用Message7-8,然后使用Message4-6。但是一旦消费者获得免费,它们就会被消费。