私のプロジェクトでは、2つの異なるJmsListenerを追加していますが、ActiveMQパネルでプロジェクトを実行すると、これらのトピックの1つだけにコンシューマーがあります。
したがって、JmsListenerごとに個別のjmsListenerContainerFactory構成を追加する必要がありますか?
@JmsListener(destination = "foo1")
public void foo1(final Message jsonMessage) throws JMSException {
...
}
@JmsListener(destination = "foo2")
public void foo12(final Message jsonMessage) throws JMSException {
...
}
編集:これは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;
}
}
setClientID()
をActiveMQConnectionFactoryプロバイダーメソッドからDefaultJmsListenerContainerFactoryプロバイダーメソッドに移動する、
JmsListenerごとに1つのグローバルなActiveMQConnectionFactoryプロバイダーメソッドと複数のDefaultJmsListenerContainerFactoryプロバイダーメソッドしか持つことができません。
したがって、最終的な作業コードは次のとおりです。
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 {
...
}
問題は、両方のリスナーが使用するJmsListenerContainerFactory
の同時実行性を1に設定したことにあると思います。
必要に応じて、複数のJmsListenerContainerFactory
を作成し、 JmsListener#containerFactory プロパティを指定して、それらをJmsListener
に設定できます。