问答详情
源自:-

MQ报2009之后阻塞在send上

连接工厂配置:

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

提问者:ppanli 2018-01-17 13:35

个回答

  • ppanli
    2018-01-18 13:24:46

    MQ2009出现原因:网络断连 、确认网络状况良好、MQ服务端连接超时 、MQ服务端和客户端程序会定时发送心跳通知(默认5秒),如果MQ服务端无法及时收到心跳通知,就会断开与客户端程序的连接,也会导致MQ2009错误。
    解决方法:修改MQ通道数、增大MQ最大连接通道个数和最大活跃连接通道个数,重启。