【发布时间】:2014-08-28 13:11:33
【问题描述】:
我们正在使用 spring 集成连接到 IBM MQ V7.5 以从队列中读取消息。我们偶尔会收到要阅读的大量信息。 SI jms 适配器无法读取大消息,但它适用于较小的消息。以下是我们得到的异常
23:18:35,470 WARN DefaultMessageListenerContainer:839 - Setup of JMS message listener invoker failed for destination 'queue:///Cis.Orders' - trying to recover. Cause:
JMSWMQ2002: Failed to get a message from destination 'XXX'.;
nested exception is com.ibm.mq.MQException: JMSCMQ0001: WebSphere MQ call failed with compcode '1' ('MQCC_WARNING') reason '2080' ('MQRC_TRUNCATED_MSG_FAILED').
com.ibm.msg.client.jms.DetailedMessageEOFException: JMSWMQ2002: Failed to get a message from destination 'Cis.Orders'.
WebSphere MQ classes for JMS attempted to perform an MQGET; however WebSphere MQ reported an error.
Use the linked exception to determine the cause of this error.
at com.ibm.msg.client.wmq.common.internal.Reason.reasonToException(Reason.java:524)
at com.ibm.msg.client.wmq.common.internal.Reason.createException(Reason.java:216)
at com.ibm.msg.client.wmq.internal.WMQMessageConsumer.checkJmqiCallSuccess(WMQMessageConsumer.java:124)
at com.ibm.msg.client.wmq.internal.WMQConsumerShadow.getMsg(WMQConsumerShadow.java:1376)
at com.ibm.msg.client.wmq.internal.WMQSyncConsumerShadow.receiveInternal(WMQSyncConsumerShadow.java:227)
at com.ibm.msg.client.wmq.internal.WMQConsumerShadow.receive(WMQConsumerShadow.java:1109)
at com.ibm.msg.client.wmq.internal.WMQMessageConsumer.receive(WMQMessageConsumer.java:460)
at com.ibm.msg.client.jms.internal.JmsMessageConsumerImpl.receiveInboundMessage(JmsMessageConsumerImpl.java:766)
at com.ibm.msg.client.jms.internal.JmsMessageConsumerImpl.receive(JmsMessageConsumerImpl.java:474)
at com.ibm.mq.jms.MQMessageConsumer.receive(MQMessageConsumer.java:212)
at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveMessage(AbstractPollingMessageListenerContainer.java:430)
at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:310)
at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:263)
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1102)
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1094)
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:991)
at java.lang.Thread.run(Thread.java:662)
Caused by: com.ibm.mq.MQException: JMSCMQ0001: WebSphere MQ call failed with compcode '1' ('MQCC_WARNING') reason '2080' ('MQRC_TRUNCATED_MSG_FAILED').
at com.ibm.msg.client.wmq.common.internal.Reason.createException(Reason.java:204)
... 15 more
任何帮助将不胜感激。感谢您的宝贵时间。
【问题讨论】:
-
"...('MQCC_WARNING') reason '2080' ('MQRC_TRUNCATED_MSG_FAILED')..." 来自异常跟踪顶部附近的信息表明系统中的任一组件都有最大长度您的真正长消息超过了,或者您的真正长消息需要很长时间才能传输,以至于在传输完成之前连接超时,然后无法处理部分消息。我建议在您的组件的配置中查找最大消息大小或超时时间。
-
感谢 Artem,我增加了 jms 通道上的接收超时,但仍然出现相同的错误,我怀疑 MQGET 发送的默认缓冲区大小为 4MB,如果消息 > 4MB,spring 默认侦听器应该捕获此异常并做另一个 MQGET 设置缓冲区大小数据长度。不确定我的理论是否正确。