Как настроить несколько JmsListener для нескольких тем
В моем проекте я добавляю два разных JmsListener, но когда я запускаю проект в панели ActiveMQ, только одна из этих тем имеет потребителя!
Так должен ли я добавить отдельную конфигурацию jmsListenerContainerFactory для каждого JmsListener ??
@JmsListener(destination = "foo1")
public void foo1(final Message jsonMessage) throws JMSException {
...
}
@JmsListener(destination = "foo2")
public void foo12(final Message jsonMessage) throws JMSException {
...
}
Edit: это из конфигурационного файла JMS:
@Configuration
@EnableJms
public class FooJmsConfig {
@Bean
public ActiveMQConnectionFactory connectionFactory() {
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory();
connectionFactory.setBrokerURL(BROKER_URL);
connectionFactory.setPassword(BROKER_USERNAME);
connectionFactory.setUserName(BROKER_PASSWORD);
connectionFactory.setUseCompression(true);
connectionFactory.setClientID("FPP_API");
connectionFactory.setConnectionIDPrefix("DRR");
connectionFactory.setUseAsyncSend(true);
return connectionFactory;
}
@Bean
public DefaultJmsListenerContainerFactory jmsListenerContainerFactory() {
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
factory.setConnectionFactory(connectionFactory());
factory.setConcurrency("1-1");
factory.setPubSubDomain(true);
factory.setSubscriptionDurable(true);
return factory;
}
}
2 ответа:
Я думаю, что проблема заключается в том, что вы установили параллелизм на 1 Для
JmsListenerContainerFactory
, используемого обоими слушателями.При необходимости можно создать несколько
JmsListenerContainerFactory
и задать их дляJmsListener
, указав СВОЙСТВО jmslistener#containerFactory.
Я узнаю, что путем перемещения
setClientID()
из метода поставщика ActiveMQConnectionFactory в метод поставщика DefaultJmsListenerContainerFactory ,У меня может быть только один метод провайдера globaly ActiveMQConnectionFactory и несколько методов провайдера DefaultJmsListenerContainerFactory для каждого jmsListener:
Таким образом, окончательный рабочий код:
Файл JMSConfig:
@Configuration @EnableJms public class FooJmsConfig { @Bean public ActiveMQConnectionFactory connectionFactory() { ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(); connectionFactory.setBrokerURL(BROKER_URL); connectionFactory.setPassword(BROKER_USERNAME); connectionFactory.setUserName(BROKER_PASSWORD); connectionFactory.setUseCompression(true); connectionFactory.setConnectionIDPrefix("DRR"); connectionFactory.setUseAsyncSend(true); return connectionFactory; } @Bean(name= "foo1") public DefaultJmsListenerContainerFactory foo1() { DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory(); factory.setConnectionFactory(connectionFactory()); factory.setConcurrency("1-1"); factory.setPubSubDomain(true); factory.setSubscriptionDurable(true); connectionFactory.setClientID("FOO_1"); return factory; } @Bean(name= "foo2") public DefaultJmsListenerContainerFactory foo2() { DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory(); factory.setConnectionFactory(connectionFactory()); factory.setConcurrency("1-1"); factory.setPubSubDomain(true); factory.setSubscriptionDurable(true); connectionFactory.setClientID("FOO_1"); return factory; } }
И слушатели jms будут
@JmsListener(destination = "foo1", containerFactory="foo1") public void foo1(final Message jsonMessage) throws JMSException { ... } @JmsListener(destination = "foo2", containerFactory="foo2") public void foo12(final Message jsonMessage) throws JMSException { ... }