不允许使用具有不同通道的两个队列管理器



我将spring-boot 2.3.2与ibmmq一起使用。我使用属性文件设置mq.

ibm.mq.queueManager=
ibm.mq.channel=
ibm.mq.connName
ibm.mq.user
ibm.mq.password
ibm.mq.useIBMCipherMappings=false
ibm.mq.userAuthenticationMQCSP=false
ibm.mq.sslCipherSuite=TLS_RSA_WITH_AES_128_CBC_SHA256

这很好。

我需要创建另一个工厂才能连接到另一个频道。所以我想创建一个类似的,默认情况下创建的,但有不同的频道名称。

所以我创建了一个配置类

@EnableJms
@Configuration
public class JmsConfig {
@Bean
public MQQueueConnectionFactory jmsMQConnectionFactoryPayment() throws JMSException {
MQQueueConnectionFactory connectionFactory = new MQQueueConnectionFactory();
connectionFactory.setQueueManager("AD_TEST");
connectionFactory.setChannel("FROM.PAYMENTMNG");
connectionFactory.setConnectionNameList("wmqd1.int.test.com(1818),wmqd2.int.test.com(1818)");

connectionFactory.setBooleanProperty(WMQConstants.USER_AUTHENTICATION_MQCSP, false);
connectionFactory.setStringProperty(WMQConstants.WMQ_SSL_CIPHER_SUITE, "TLS_RSA_WITH_AES_128_CBC_SHA256");
connectionFactory.setIntProperty(CommonConstants.WMQ_CONNECTION_MODE, CommonConstants.WMQ_CM_CLIENT);

System.setProperty("com.ibm.mq.cfg.useIBMCipherMappings", String.valueOf(Boolean.FALSE));
connectionFactory.createConnection("123", "123");
return connectionFactory;
}
@Bean
JmsListenerContainerFactory<?> jmsContainerFactoryPayment() throws JMSException {
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
factory.setConnectionFactory(jmsMQConnectionFactoryPayment());
return factory;
}
@Bean("payment")
JmsTemplate jmsTemplatePayment() throws JMSException {
JmsTemplate template = new JmsTemplate();
template.setConnectionFactory(jmsMQConnectionFactoryPayment());
return template;
}

}

在课堂上我有

@JmsListener(destination="xxx", containerFactory="jmsContainerFactoryPayment"){
....
}

当我开始申请时,我会得到

com.ibm.msg.client.jms.DetailedIllegalStateException: JMSWMQ0018: E Failed to connect to queue manager 'AD_TEST' with connection mode 'Client' and host name 'wmqd1.int.test.com(1818),wmqd2.int.test.com(1818)'.
at com.ibm.msg.client.wmq.common.internal.Reason.reasonToException(Reason.java:489) ~[com.ibm.mq.allclient-9.2.0.0.jar:9.2.0.0 - p920-L200710.DE]
at com.ibm.msg.client.wmq.common.internal.Reason.createException(Reason.java:215) ~[com.ibm.mq.allclient-9.2.0.0.jar:9.2.0.0 - p920-L200710.DE]
at com.ibm.msg.client.wmq.internal.WMQConnection.<init>(WMQConnection.java:450) ~[com.ibm.mq.allclient-9.2.0.0.jar:9.2.0.0 - p920-L200710.DE]
at com.ibm.msg.client.wmq.factories.WMQConnectionFactory.createV7ProviderConnection(WMQConnectionFactory.java:8475) ~[com.ibm.mq.allclient-9.2.0.0.jar:9.2.0.0
Caused by: com.ibm.mq.MQException: JMSCMQ0001: IBM MQ  call failed with compcode '2' ('MQCC_FAILED') ; reason '2538' ('MQRC_HOST_NOT_AVAILABLE').
at com.ibm.msg.client.wmq.common.internal.Reason.createException(Reason.java:203) ~[com.ibm.mq.allclient-9.2.0.0.jar:9.2.0.0 - p920-L200710.DE]
... 51 common frames omitted

看起来我们不能有两个具有相同主机但不同通道的队列管理器

我已经用IBM MQ配置了Spring Boot来测试这一点。从这个IBMMessaging 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.javaListenerThree.java。然后,我在示例中添加了一个新的ListenerBeanConfig.java类。

CCD_ 7被改变为绑定到稍后创建的新的CCD_ 8配置CCD_。

@JmsListener(destination = Application.qName, containerFactory = "listenerTwoFactory")

ListenerThree.java被更改为绑定到新的listenerThreeFactory配置和Queue

@JmsListener(destination = "DEV.QUEUE.2", containerFactory = "listenerThreeFactory")

ListenerBeanConfig.java类声明进行了注释,这样我就可以通过为每个属性添加字符串来访问我的属性,例如queueManagerchannelconnName等,并为每个属性提供setter方法,例如

@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

@Bean
public ListenerTwo myListenerTwo() {
return new ListenerTwo();
}
@Bean
public ListenerThree myListenerThree() {
return new ListenerThree();
}

然后我创建了新的连接工厂配置listenerTwoFactorylistenerThreeFactory

对于listenerTwoFactory,我在Spring Boot配置中使用了com.ibm.mq.jms提供的JMS类

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,我使用了com.ibm.mq.spring.boot中的MQ JMS助手类。

@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队列管理器docker实例,我使用IBM MQ控制台,将消息放入QM1: DEV.QUEUE.1QM2: 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.SVRCONNDEV.APP.SVRCONN.TWO

我相信还有更优雅的方式来管理额外的房产。

最新更新