在高负载期间,我们看到MQQueueConnectionFactory突然尝试连接到默认MQ端口1414,而不是指定的端口。
背景:
我们使用Websphere 9.0.5.13来部署ear文件。Java版本: 8.0.7.15。此Websphere中的服务器与外部IBM通信。我们使用IBM库版本: com.ibm.mq.allclient-9.2.5.0.jar。我们连接到3个不同的IBM队列管理器和数百个通道。我们不使用IBM默认端口号,即1414。相反,我们将其覆盖到其他端口。在发送到队列之前,我们总是使用新的MQQueueConnectionFactory,然后关闭发送方、会话和连接。
发行:
在服务器开始时,我们同时处理多个队列。在大多数情况下,这导致:
JMSCMQ0001: IBM调用失败,compcode '2‘('MQCC_FAILED')原因是'2538’('MQRC_HOST_NOT_AVAILABLE')。
更深层次地讲,这是因为MQQueueConnectionFactory试图连接到默认端口1414,而不是我们配置的正确端口。
由: com.ibm.mq.jmqi.JmqiException: CC=2;RC=2538;AMQ9204:连接到主机'ecpmq2(1414)‘拒绝。[1=com.ibm.mq.jmqi.JmqiException[CC=2;RC=2538;AMQ9204:与主机'hostname******/ipaddr***...:1414‘的连接被拒绝。[1=java.net.ConnectExceptionA远程主机在超时期间内没有响应。(连接定时out),3=hostname***/ipaddr***...:1414,4=TCP,5=Socket.connect]],3=hostname***(1414),4=,5=RemoteTCPConnection.bindAndConnectSocket] )
我试图在本地PC和我们的测试env中复制这个场景,但没有结果。
示例代码:
这是我们的密码。是的,代码从效率上讲是farcry,但它仍然不能解释为什么MQ突然试图连接到默认端口。
for (String msg : messages) {
MQQueueConnectionFactory queueConnectionFactory = null;
MQQueueConnection mqConn = null;
try {
queueConnectionFactory = new MQQueueConnectionFactory();
queueConnectionFactory.setQueueManager(queueInfo.getQueueManager());
queueConnectionFactory.setHostName(queueInfo.getHostname());
queueConnectionFactory.setPort(queueInfo.getPort());
queueConnectionFactory.setChannel(queueInfo.getChannel());
queueConnectionFactory.setTransportType(JMSC.MQJMS_TP_CLIENT_MQ_TCPIP);
mqConn = (MQQueueConnection) queueConnectionFactory.createQueueConnection();
mqConn.start();
sendSingleMsg(mqConn, queueInfo.getQueueName(), msg);
} catch (Exception e) {
log.error(e.getMessage(), e);
printQueueDetails(queueConnectionFactory);
} finally {
if (mqConn != null) {
try {
mqConn.close();
} catch (JMSException ex) {
log.error(ex.getMessage(), ex);
}
mqConn = null;
}
}
}问题:
是否可能由于高度并发性导致MQQueueConnectionFactory在某个地方失败,并将端口设置为默认端口而不是指定的端口?它是否保留了一些故障转移主机名,并包括默认端口?
发布于 2022-10-11 13:47:33
原因之一可能是没有测试什么
queueInfo.getPort()退货。我会记录返回,看看是否有条件,当它没有返回您期望的端口。
https://stackoverflow.com/questions/74025031
复制相似问题