我收到以下错误。亲自帮助
[14年8月8日21:14:56:939 GMT-08:00] 00000005 TimeoutManage我WTRN0006W:事务00000147B92EFAE20000000100000012DF462C9E681BA3670A44A25FE1B0F6182303FB5C00000147B92EFAE20000000100000012DF462C9E681BA3670A44A25FE1B0F6182303FB5C00000001已120秒后的超时
[8/8/14 21:14:56:967 GMT-08:00] 00000006 TimeoutManage I WTRN0124I:超时发生时,事务所关联的线程或最近关联的线程是Thread [WMQJCAResourceAdapter:4,5,主要]。发生超时时此线程的堆栈跟踪是:
java.net.SocketOutputStream.socketWrite0(Native Method)
java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:103)
java.net.SocketOutputStream.write(SocketOutputStream.java:147)
com.ibm.mq.jmqi.remote.internal.RemoteTCPConnection.send(RemoteTCPConnection.java:1212)
com.ibm.mq.jmqi.remote.internal.system.RemoteConnection.sendTSH(RemoteConnection.java:2289)
com.ibm.mq.jmqi.remote.internal.RemoteHconn.sendTSH(RemoteHconn.java:954)
com.ibm.mq.jmqi.remote.internal.RemoteFAP.jmqiPut(RemoteFAP.java:5443)
com.ibm.mq.jmqi.remote.internal.RemoteFAP.MQPUT(RemoteFAP.java:5205)
com.ibm.msg.client.wmq.v6.base.internal.MQSESSION.MQPUT(MQSESSION.java:1252)
com.ibm.msg.client.wmq.v6.base.internal.MQQueue.putMsg2(MQQueue.java:2090)
com.ibm.msg.client.wmq.v6.jms.internal.MQMessageProducer.sendInternal(MQMessageProducer.java:1262)
com.ibm.msg.client.wmq.v6.jms.internal.MQMessageProducer.send(MQMessageProducer.java:768)
com.ibm.msg.client.wmq.v6.jms.internal.MQMessageProducer.send(MQMessageProducer.java:2713)
com.ibm.msg.client.jms.internal.JmsMessageProducerImpl.sendMessage(JmsMessageProducerImpl.java:872)
com.ibm.msg.client.jms.internal.JmsMessageProducerImpl.send_(JmsMessageProducerImpl.java:727)
com.ibm.msg.client.jms.internal.JmsMessageProducerImpl.send(JmsMessageProducerImpl.java:398)
com.ibm.mq.jms.MQMessageProducer.send(MQMessageProducer.java:281)
com.ibm.ejs.jms.JMSQueueSenderHandle.send(JMSQueueSenderHandle.java:204)
com.scb.sts.stsappserver.sender.MessageSender.sendRecords(Unknown Source)
com.scb.sts.services.PCSPPaymentSplitter.doExecute(Unknown Source)
com.scb.sts.stsappserver.eventhandler.SplitterEventHandler.handleEvent(Unknown Source)
com.scb.sts.services.PCSPPaymentReceiver.doProcess(Unknown Source)
com.scb.sts.services.PCSPPaymentReceiver.doExecute(Unknown Source)
com.scb.sts.controllers.OCWSServlet.doPost(Unknown Source)
com.scb.sts.qlcomm.QLCommBean.processXMLFile(Unknown Source)
com.scb.sts.qlcomm.QLCommBean.isDoOutput(Unknown Source)
com.scb.sts.qlcomm.QLCommBean.onMessage(Unknown Source)
com.ibm.ejs.container.MessageEndpointHandler.invokeMdbMethod(MessageEndpointHandler.java:1093)
com.ibm.ejs.container.MessageEndpointHandler.invoke(MessageEndpointHandler.java:778)
$Proxy32.onMessage(Unknown Source)
com.ibm.mq.connector.inbound.MessageEndpointWrapper.onMessage(MessageEndpointWrapper.java:131)
com.ibm.mq.jms.MQSession$FacadeMessageListener.onMessage(MQSession.java:147)
com.ibm.msg.client.jms.internal.JmsSessionImpl.run(JmsSessionImpl.java:2557)
com.ibm.mq.jms.MQSession.run(MQSession.java:860)
com.ibm.mq.connector.inbound.WorkImpl.run(WorkImpl.java:172)
com.ibm.ejs.j2c.work.WorkProxy.run(WorkProxy.java:399)
com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1604)
答案 0 :(得分:1)
事务超时只是意味着事务未在超时到期之前提交,在这种情况下,120秒没有提交。
堆栈显示您位于名为QLCommBean的MDB的onMessage()函数中。而且这个MDB通过MessageSender.sendRecords()发送一些消息,而后者又被称为MQ JMS API:
JMSQueueSenderHandle.send()
堆栈的顶部是:
java.net.SocketOutputStream.socketWrite0(原生方法)
这意味着事务超时时MDB中的活动代码是套接字写入(通过网络发送数据)。在这种情况下,MQ正在向队列管理器发送消息。
事务超时本身不是错误。您需要查看MDB逻辑并确定120s是否是MDB中的适当时间量。如果不是,我建议您向MDB添加日志记录,以了解它为120s做了什么。 可能是MQ代码已经耗费了大量的时间,但可能不是。显示的堆栈就是在调用onMessage()之后代码恰好是120s的位置。
作为通过网络向队列管理器发送数据的过程中的MQ,您可能需要查看网络以查看其是否正常运行,或者可能是您的队列管理器。它可能负载很重。
如果这种情况经常发生,一个不错的选择是在120s的过程中采取一些javacores。然后,您可以在各个点看到堆栈的内容。
否则我建议:
1)检测您的MDB,确保您知道执行了哪些代码,以及在什么时间执行。只有这样才能排除你的MDB逻辑
2)考虑你的网络
3)可能跟踪您的队列管理器& MQ JMS代码 - 您可能需要IBM的帮助来确定IBM代码所用的时间是否合适
4)如果120s是onMessage()的可接受时间长度,请考虑将事务超时值增加到大于您认为onMessage()可接受的最大时间的值。