OpenShift环境Spring Boot连接IBM MQ报2538异常原因咨询
OpenShift环境Spring Boot连接IBM MQ报MQRC_HOST_NOT_AVAILABLE(2538)原因排查
问题背景
Spring Boot应用运行在OpenShift环境,需对接IBM MQ服务,JMS相关配置已写入application.yaml,应用启动时抛出连接异常。
错误堆栈
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.4.0.jar:9.2.4.0 - p924-L211104] ... 96 common frames omitted Caused by: com.ibm.mq.jmqi.JmqiException: CC=2;RC=2538;AMQ9204: Connection to host 'localhost(1414)' rejected. [1=com.ibm.mq.jmqi.JmqiException[CC=2;RC=2538;AMQ9204: Connection to host 'localhost/127.0.0.1:1414' rejected. [1=java.net.ConnectException[Connection refused (Connection refused)],3=localhost/127.0.0.1:1414,4=TCP,5=Socket.connect]],3=localhost(1414),4=,5=RemoteTCPConnection.bindAndConnectSocket] at com.ibm.mq.jmqi.remote.api.RemoteFAP$Connector.jmqiConnect(RemoteFAP.java:13610) ~[com.ibm.mq.allclient-9.2.4.0.jar:9.2.4.0 - p924-L211104] at com.ibm.mq.jmqi.remote.api.RemoteFAP$Connector.access$100(RemoteFAP.java:13150) ~[com.ibm.mq.allclient-9.2.4.0.jar:9.2.4.0 - p924-L211104] at com.ibm.mq.jmqi.remote.api.RemoteFAP.jmqiConnect(RemoteFAP.java:1449) ~[com.ibm.mq.allclient-9.2.4.0.jar:9.2.4.0 - p924-L211104] at com.ibm.mq.jmqi.remote.api.RemoteFAP.jmqiConnect(RemoteFAP.java:1390) ~[com.ibm.mq.allclient-9.2.4.0.jar:9.2.4.0 - p924-L211104] at com.ibm.mq.ese.jmqi.InterceptedJmqiImpl.jmqiConnect(InterceptedJmqiImpl.java:377) ~[com.ibm.mq.allclient-9.2.4.0.jar:9.2.4.0 - p924-L211104] at com.ibm.mq.ese.jmqi.ESEJMQI.jmqiConnect(ESEJMQI.java:562) ~[com.ibm.mq.allclient-9.2.4.0.jar:9.2.4.0 - p924-L211104] at com.ibm.msg.client.wmq.internal.WMQConnection.<init>(WMQConnection.java:391) ~[com.ibm.mq.allclient-9.2.4.0.jar:9.2.4.0 - p924-L211104] ... 95 common frames omitted Caused by: com.ibm.mq.jmqi.JmqiException: CC=2;RC=2538;AMQ9204: Connection to host 'localhost/127.0.0.1:1414' rejected. [1=java.net.ConnectException[Connection refused (Connection refused)],3=localhost/127.0.0.1:1414,4=TCP,5=Socket.connect] at com.ibm.mq.jmqi.remote.impl.RemoteTCPConnection.bindAndConnectSocket(RemoteTCPConnection.java:932) ~[com.ibm.mq.allclient-9.2.4.0.jar:9.2.4.0 - p924-L211104] at com.ibm.mq.jmqi.remote.impl.RemoteTCPConnection.protocolConnect(RemoteTCPConnection.java:1419) ~[com.ibm.mq.allclient-9.2.4.0.jar:9.2.4.0 - p924-L211104] at com.ibm.mq.jmqi.remote.impl.RemoteConnection.connect(RemoteConnection.java:1012) ~[com.ibm.mq.allclient-9.2.4.0.jar:9.2.4.0 - p924-L211104] at com.ibm.mq.jmqi.remote.impl.RemoteConnectionSpecification.getNewConnection(RemoteConnectionSpecification.java:688) ~[com.ibm.mq.allclient-9.2.4.0.jar:9.2.4.0 - p924-L211104] at com.ibm.mq.jmqi.remote.impl.RemoteConnectionSpecification.getSessionFromNewConnection(RemoteConnectionSpecification.java:282) ~[com.ibm.mq.allclient-9.2.4.0.jar:9.2.4.0 - p924-L211104] at com.ibm.mq.jmqi.remote.impl.RemoteConnectionSpecification.getSession(RemoteConnectionSpecification.java:181) ~[com.ibm.mq.allclient-9.2.4.0.jar:9.2.4.0 - p924-L211104] at com.ibm.mq.jmqi.remote.impl.RemoteConnectionPool.getSession(RemoteConnectionPool.java:127) ~[com.ibm.mq.allclient-9.2.4.0.jar:9.2.4.0 - p924-L211104] at com.ibm.mq.jmqi.remote.api.RemoteFAP$Connector.jmqiConnect(RemoteFAP.java:13350) ~[com.ibm.mq.allclient-9.2.4.0.jar:9.2.4.0 - p924-L211104] ... 101 common frames omitted
现有配置
spring: environment: DEV jms: wmq: host: mq.cloud-mq.svc.cluster.local port: 1414 queue-manager: channel: DEV.APP.SVRCONN
可能的故障原因
从堆栈信息可以直接看到,MQ客户端实际尝试连接的地址是localhost/127.0.0.1:1414,和配置里写的内部Service域名完全不一致,优先排查配置加载问题,再排查网络和服务端问题:
- 配置前缀不匹配,自定义配置未生效:Spring Boot官方IBM MQ Starter默认读取的配置前缀是
spring.jms.ibm.mq.*,当前yaml里写的是spring.jms.wmq.*,如果没有自定义@ConfigurationProperties绑定类做映射,这套配置根本不会被MQ连接工厂读取,客户端会直接使用默认值localhost:1414发起连接,这是该问题最常见的诱因。 - 自定义配置类未被Spring容器识别:如果是自己实现配置类读取MQ参数,要检查:
- 配置类上的
@ConfigurationProperties注解指定的前缀是否和yaml路径一致 - 配置类是否加了
@Component注解,或者有没有在启动类/配置类上加@EnableConfigurationProperties指定要加载的配置类,否则参数值不会注入到连接工厂Bean中
- 配置类上的
- OpenShift集群网络连通性异常:如果确认配置已经正确加载,客户端实际读取到了配置的Service域名,再排查网络问题:
- 进入应用Pod,用
nc -zv mq.cloud-mq.svc.cluster.local 1414或者telnet命令测试端口连通性 - 检查MQ服务和应用是否在同一命名空间,跨命名空间访问时Service的全域名是否配置正确
- 检查MQ对应的Service、Endpoint资源是否正常,是否正确关联到运行中的MQ Pod,1414端口是否在Service中正确暴露
- 检查OpenShift NetworkPolicy规则,是否放通了应用Pod到MQ服务1414端口的访问权限
- 进入应用Pod,用
- IBM MQ服务端异常:
- MQ队列管理器是否正常启动,TCP监听器是否正常监听1414端口
- MQ监听器是否绑定了0.0.0.0地址,如果只绑定127.0.0.1会拒绝所有外部连接请求
- 空配置项触发参数 fallback:当前配置中
queue-manager的值为空,部分低版本的IBM MQ客户端在参数存在空值时,会触发连接参数初始化失败,自动回退到默认的本地连接参数,可以先填入实际的队列管理器名称再做验证。
内容的提问来源于stack exchange,提问作者user2023141
相关产品推荐
相关产品推荐

