Я настроил Spring Boot с IBM MQ, чтобы проверить это. Начиная с образца, представленного в этом IBM Messaging GitHub Repo , я добавил два дополнительных слушателя следующим образом.
Сначала я добавил некоторые дополнительные свойства в application.properties
файл
my.mq.queueManager=QM2
my.mq.channel=DEV.APP.SVRCONN
my.mq.connName=localhost(1415)
my.mq.user=<your_user_name>
my.mq.password=<your_password>
Я оставил Application.java
без изменений, скопировал Listener.java
, чтобы создать ListenerTwo.java
и ListenerThree.java
. Затем я добавил в образец новый класс ListenerBeanConfig.java
.
ListenerTwo.java
было изменено для привязки к новой ConnectionFactory
конфигурации listenerTwoFactory
, которая создается позже.
@JmsListener(destination = Application.qName, containerFactory = "listenerTwoFactory")
ListenerThree.java
был изменен для привязки к новой конфигурации listenerThreeFactory
, а Queue
@JmsListener(destination = "DEV.QUEUE.2", containerFactory = "listenerThreeFactory")
Объявление класса ListenerBeanConfig.java
было аннотировано, чтобы я мог получить доступ к своим свойствам, добавив строки для каждого свойства, например, queueManager
, channel
, connName
и c. и предоставляя методы установки для каждого из них, например,
@Configuration
@EnableJms
@ConfigurationProperties(prefix="my.mq")
public class ListenerBeanConfig {
String connName;
public void setConnName(String value) {
System.out.println("connName is set to: "+value);
connName = value;
}
Я зарегистрировал два новых Listener
beans
@Bean
public ListenerTwo myListenerTwo() {
return new ListenerTwo();
}
@Bean
public ListenerThree myListenerThree() {
return new ListenerThree();
}
Затем я создал новые конфигурации фабрики соединений listenerTwoFactory
и listenerThreeFactory
Для listenerTwoFactory
я использовал классы JMS, предоставленные com.ibm.mq.jms
в конфигурации Spring Boot
JmsConnectionFactory cf;
@Bean
public DefaultJmsListenerContainerFactory listenerTwoFactory() {
DefaultJmsListenerContainerFactory containerFactory = new DefaultJmsListenerContainerFactory();
try {
JmsFactoryFactory ff = JmsFactoryFactory.getInstance(WMQConstants.WMQ_PROVIDER);
cf = ff.createConnectionFactory();
cf.setStringProperty(WMQConstants.WMQ_CONNECTION_NAME_LIST, connName);
cf.setStringProperty(WMQConstants.WMQ_CHANNEL, channel);
cf.setIntProperty(WMQConstants.WMQ_CONNECTION_MODE, WMQConstants.WMQ_CM_CLIENT);
cf.setStringProperty(WMQConstants.WMQ_QUEUE_MANAGER, queueManager);
cf.setStringProperty(WMQConstants.WMQ_APPLICATIONNAME, "Spring Boot ListenerTwo");
cf.setBooleanProperty(WMQConstants.USER_AUTHENTICATION_MQCSP, true);
cf.setStringProperty(WMQConstants.USERID, user);
cf.setStringProperty(WMQConstants.PASSWORD, password);
} catch (JMSException jmsex) {
System.out.println(jmsex);
}
containerFactory.setConnectionFactory(cf);
return containerFactory;
}
Для listenerThreeFactory
я использовал помощник MQ JMS классы из com.ibm.mq.spring.boot
.
@Bean
public DefaultJmsListenerContainerFactory listenerThreeFactory() {
MQConfigurationProperties myProps = new MQConfigurationProperties();
myProps.setUser(user);
myProps.setChannel(channel);
myProps.setConnName(connName);
myProps.setPassword(password);
myProps.setQueueManager(queueManager);
//No customizer
MQConnectionFactoryFactory mqcff = new MQConnectionFactoryFactory(myProps,null);
MQConnectionFactory mqcf = mqcff.createConnectionFactory(MQConnectionFactory.class);
DefaultJmsListenerContainerFactory containerFactory = new DefaultJmsListenerContainerFactory();
containerFactory.setConnectionFactory(mqcf);
return containerFactory;
}
Наконец, я скомпилировал и запустил новый образец конфигурации. Используя IBM MQ Console для двух экземпляров администратора очередей IBM MQ docker, я помещаю сообщения в QM1: DEV.QUEUE.1
и QM2: DEV.QUEUE.1, DEV.QUEUE.2
. На терминале увидите следующий вывод.
========================================
Received message is: message 1
========================================
========================================
ListenerTwo received message is: message 2
========================================
========================================
ListenerThree received message is: message 3
========================================
Также протестировано со всеми тремя слушателями, подключенными к QM2 через два разных канала: DEV.APP.SVRCONN
и DEV.APP.SVRCONN.TWO
.
Я уверен, что есть - гораздо более элегантные способы управления дополнительными свойствами.