连接工厂配置:
bean id="WX_ConnectionFactory" class="com.ibm.mq.jms.MQQueueConnectionFactory">
<property name="hostName" value="{{UMBP.WX.hostName}}" />
<property name="port" value="{{UMBP.WX.port}}" />
<property name="CCSID" value="1381" />
<property name="channel" value="SYSTEM.DEF.SVRCONN"/>
<property name="queueManager" value="{{UMBP.WX.queueManager}}" />
<property name="transportType" value="1"/>
</bean>
模板配置:
<bean id="wxTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="WX_ConnectionFactory" />
<property name="defaultDestination" ref="WX_queueSend" />
<property name="pubSubDomain" value="false" />
</bean>
===============================================================
程序程序:
try
{
MessageCreator messageCreator = createTxtMsg(msg);
wxTemplate.setExplicitQosEnabled(true);
wxTemplate.setPriority(data.getSprior());
79 wxTemplate.send(messageCreator);
80 log.info("微信从发送表到MQ处理完成,UUID:["+data.getUuid()+"],数据内容:" + msg);
81}
82catch (JmsException e)
83{
84 data.setState(5);
85 pushWeixinMapper.updateByPrimaryKey(data);
86 log.error("微信从发送表到MQ处理时发生错误,错误原因:", e);
return;
}
==============================================================
该段程序单线程不断的向MQ队列中发送消息,2017年每天发送小于1万条消息,没问题。现在每天发送5万条,差不多一个星期就会挂掉一次。
报错前第几条消息在79行send消息后,86行会抛出异常,报错码2009.
最后一条消息就堵塞在79行上,等待很久都没释放。
==============================================================
详细报错信息:
[2018-01-15 17:05:59,455][pool-14-thread-1][com.tienon.service.jms.MQ.sender.WeiXinMQSender.sendMSG(WeiXinMQSender.java:86)](微信从发送表到MQ处理时发生错误,错误原因:)
org.springframework.jms.UncategorizedJmsException: Uncategorized exception occured during JMS processing; nested exception is com.ibm.msg.client.jms.DetailedJMSException: JMSWMQ0018: 连接至队列管理器“QM_C_UMBP2”失败,连接方式为“Client”,主机名为“ums-umbp-02.prd.bsz.com”。 检查队列管理器是否已启动,如果正在以客户机方式运行,那么还要检查是否有侦听器在运行。请参阅链接的异常以获取更多信息。; nested exception is com.ibm.mq.MQException: JMSCMQ0001: WebSphere MQ 调用失败,完成代码为“2”(“MQCC_FAILED”),原因为“2009”(“MQRC_CONNECTION_BROKEN”)。
at org.springframework.jms.support.JmsUtils.convertJmsAccessException(JmsUtils.java:308)
at org.springframework.jms.support.JmsAccessor.convertJmsAccessException(JmsAccessor.java:168)
at org.springframework.jms.core.JmsTemplate.execute(JmsTemplate.java:474)
at org.springframework.jms.core.JmsTemplate.send(JmsTemplate.java:539)
at org.springframework.jms.core.JmsTemplate.send(JmsTemplate.java:531)
at com.tienon.service.jms.MQ.sender.WeiXinMQSender.sendMSG(WeiXinMQSender.java:79)
at com.tienon.service.jms.MQ.sender.WeiXinMQSender.sendMSGList(WeiXinMQSender.java:103)
at com.tienon.service.jms.MQ.SendMsgToMQRunnable.run(SendMsgToMQRunnable.java:134)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:439)
at java.util.concurrent.FutureTask$Sync.innerRunAndReset(FutureTask.java:317)
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:150)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$101(ScheduledThreadPoolExecutor.java:98)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.runPeriodic(ScheduledThreadPoolExecutor.java:180)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:204)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
at java.lang.Thread.run(Thread.java:738)
Caused by: com.ibm.msg.client.jms.DetailedJMSException: JMSWMQ0018: 连接至队列管理器“QM_C_UMBP2”失败,连接方式为“Client”,主机名为“ums-umbp-02.prd.bsz.com”。 检查队列管理器是否已启动,如果正在以客户机方式运行,那么还要检查是否有侦听器在运行。请参阅链接的异常以获取更多信息。
at com.ibm.msg.client.wmq.common.internal.Reason.reasonToException(Reason.java:599)
at com.ibm.msg.client.wmq.common.internal.Reason.createException(Reason.java:219)
at com.ibm.msg.client.wmq.internal.WMQConnection.<init>(WMQConnection.java:410)
at com.ibm.msg.client.wmq.factories.WMQConnectionFactory.createV7ProviderConnection(WMQConnectionFactory.java:7855)
at com.ibm.msg.client.wmq.factories.WMQConnectionFactory.createProviderConnection(WMQConnectionFactory.java:7331)
at com.ibm.msg.client.jms.admin.JmsConnectionFactoryImpl.createConnection(JmsConnectionFactoryImpl.java:276)
at com.ibm.mq.jms.MQConnectionFactory.createCommonConnection(MQConnectionFactory.java:6058)
at com.ibm.mq.jms.MQQueueConnectionFactory.createQueueConnection(MQQueueConnectionFactory.java:115)
at com.ibm.mq.jms.MQQueueConnectionFactory.createConnection(MQQueueConnectionFactory.java:198)
at org.springframework.jms.support.JmsAccessor.createConnection(JmsAccessor.java:184)
at org.springframework.jms.core.JmsTemplate.execute(JmsTemplate.java:461)
... 14 more
Caused by: com.ibm.mq.MQException: JMSCMQ0001: WebSphere MQ 调用失败,完成代码为“2”(“MQCC_FAILED”),原因为“2009”(“MQRC_CONNECTION_BROKEN”)。
at com.ibm.msg.client.wmq.common.internal.Reason.createException(Reason.java:206)
... 23 more
Caused by: com.ibm.mq.jmqi.JmqiException: CC=2;RC=2009;AMQ9206: 数据发送到主机 'ums-umbp-02.prd.bsz.com/1?.?.8.212:334?? (ums-umbp-02.prd.bsz.com)' 的错误。 [1=java.net.SocketException[Socket closed],3=ums-umbp-02.prd.bsz.com/1?.?.8.212:334? (ums-umbp-02.prd.bsz.com),4=TCP,5=OutputStream.write]
at com.ibm.mq.jmqi.remote.internal.RemoteTCPConnection.send(RemoteTCPConnection.java:1270)
at com.ibm.mq.jmqi.remote.internal.system.RemoteConnection.sendTSH(RemoteConnection.java:2457)
at com.ibm.mq.jmqi.remote.internal.system.RemoteConnection.addHconn(RemoteConnection.java:791)
at com.ibm.mq.jmqi.remote.internal.system.RemoteConnectionPool.getConnection(RemoteConnectionPool.java:311)
at com.ibm.mq.jmqi.remote.internal.RemoteFAP.jmqiConnect(RemoteFAP.java:1371)
at com.ibm.msg.client.wmq.internal.WMQConnection.<init>(WMQConnection.java:331)
... 22 more
Caused by: java.net.SocketException: Socket closed
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:99)
at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
at com.ibm.mq.jmqi.remote.internal.RemoteTCPConnection.send(RemoteTCPConnection.java:1212)
... 27 more
[2018-01-15 17:05:59,510][pool-14-thread-1][com.tienon.service.jms.MQ.sender.WeiXinMQSender.sendMSG(WeiXinMQSender.java:86)](微信从发送表到MQ处理时发生错误,错误原因:)
org.springframework.jms.UncategorizedJmsException: Uncategorized exception occured during JMS processing; nested exception is com.ibm.msg.client.jms.DetailedJMSException: JMSWMQ0018: 连接至队列管理器“QM_C_UMBP2”失败,连接方式为“Client”,主机名为“ums-umbp-02.prd.bsz.com”。 检查队列管理器是否已启动,如果正在以客户机方式运行,那么还要检查是否有侦听器在运行。请参阅链接的异常以获取更多信息。; nested exception is com.ibm.mq.MQException: JMSCMQ0001: WebSphere MQ 调用失败,完成代码为“2”(“MQCC_FAILED”),原因为“2009”(“MQRC_CONNECTION_BROKEN”)。
at org.springframework.jms.support.JmsUtils.convertJmsAccessException(JmsUtils.java:308)
at org.springframework.jms.support.JmsAccessor.convertJmsAccessException(JmsAccessor.java:168)
at org.springframework.jms.core.JmsTemplate.execute(JmsTemplate.java:474)
at org.springframework.jms.core.JmsTemplate.send(JmsTemplate.java:539)
at org.springframework.jms.core.JmsTemplate.send(JmsTemplate.java:531)
at com.tienon.service.jms.MQ.sender.WeiXinMQSender.sendMSG(WeiXinMQSender.java:79)
at com.tienon.service.jms.MQ.sender.WeiXinMQSender.sendMSGList(WeiXinMQSender.java:103)
at com.tienon.service.jms.MQ.SendMsgToMQRunnable.run(SendMsgToMQRunnable.java:134)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:439)
at java.util.concurrent.FutureTask$Sync.innerRunAndReset(FutureTask.java:317)
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:150)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$101(ScheduledThreadPoolExecutor.java:98)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.runPeriodic(ScheduledThreadPoolExecutor.java:180)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:204)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
at java.lang.Thread.run(Thread.java:738)
Caused by: com.ibm.msg.client.jms.DetailedJMSException: JMSWMQ0018: 连接至队列管理器“QM_C_UMBP2”失败,连接方式为“Client”,主机名为“ums-umbp-02.prd.bsz.com”。 检查队列管理器是否已启动,如果正在以客户机方式运行,那么还要检查是否有侦听器在运行。请参阅链接的异常以获取更多信息。
at com.ibm.msg.client.wmq.common.internal.Reason.reasonToException(Reason.java:599)
at com.ibm.msg.client.wmq.common.internal.Reason.createException(Reason.java:219)
at com.ibm.msg.client.wmq.internal.WMQConnection.<init>(WMQConnection.java:410)
at com.ibm.msg.client.wmq.factories.WMQConnectionFactory.createV7ProviderConnection(WMQConnectionFactory.java:7855)
at com.ibm.msg.client.wmq.factories.WMQConnectionFactory.createProviderConnection(WMQConnectionFactory.java:7331)
at com.ibm.msg.client.jms.admin.JmsConnectionFactoryImpl.createConnection(JmsConnectionFactoryImpl.java:276)
at com.ibm.mq.jms.MQConnectionFactory.createCommonConnection(MQConnectionFactory.java:6058)
at com.ibm.mq.jms.MQQueueConnectionFactory.createQueueConnection(MQQueueConnectionFactory.java:115)
at com.ibm.mq.jms.MQQueueConnectionFactory.createConnection(MQQueueConnectionFactory.java:198)
at org.springframework.jms.support.JmsAccessor.createConnection(JmsAccessor.java:184)
at org.springframework.jms.core.JmsTemplate.execute(JmsTemplate.java:461)
... 14 more
Caused by: com.ibm.mq.MQException: JMSCMQ0001: WebSphere MQ 调用失败,完成代码为“2”(“MQCC_FAILED”),原因为“2009”(“MQRC_CONNECTION_BROKEN”)。
at com.ibm.msg.client.wmq.common.internal.Reason.createException(Reason.java:206)
... 23 more
Caused by: com.ibm.mq.jmqi.JmqiException: CC=2;RC=2009;AMQ9206: 数据发送到主机 'ums-umbp-02.prd.bsz.com/1?.?.8.212:334? (ums-umbp-02.prd.bsz.com)' 的错误。 [1=java.net.SocketException[Socket closed],3=ums-umbp-02.prd.bsz.com/1?.?.8.212:334? (ums-umbp-02.prd.bsz.com),4=TCP,5=OutputStream.write]
at com.ibm.mq.jmqi.remote.internal.RemoteTCPConnection.send(RemoteTCPConnection.java:1270)
at com.ibm.mq.jmqi.remote.internal.system.RemoteConnection.sendTSH(RemoteConnection.java:2457)
at com.ibm.mq.jmqi.remote.internal.system.RemoteConnection.addHconn(RemoteConnection.java:791)
at com.ibm.mq.jmqi.remote.internal.system.RemoteConnectionPool.getConnection(RemoteConnectionPool.java:311)
at com.ibm.mq.jmqi.remote.internal.RemoteFAP.jmqiConnect(RemoteFAP.java:1371)
at com.ibm.msg.client.wmq.internal.WMQConnection.<init>(WMQConnection.java:331)
... 22 more
Caused by: java.net.SocketException: Socket closed
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:99)
at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
at com.ibm.mq.jmqi.remote.internal.RemoteTCPConnection.send(RemoteTCPConnection.java:1212)
... 27 more
MQ2009出现原因:网络断连 、确认网络状况良好、MQ服务端连接超时 、MQ服务端和客户端程序会定时发送心跳通知(默认5秒),如果MQ服务端无法及时收到心跳通知,就会断开与客户端程序的连接,也会导致MQ2009错误。
解决方法:修改MQ通道数、增大MQ最大连接通道个数和最大活跃连接通道个数,重启。