【问题标题】:Spring Integration - IBM MQ - Consuming large messages from QueueSpring Integration - IBM MQ - 使用队列中的大消息
【发布时间】: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 设置缓冲区大小数据长度。不确定我的理论是否正确。

标签: ibm-mq spring-integration


【解决方案1】:

JMS 客户端不应返回 MQRC_TRUNCATED_MSG_FAILED,因为您无法对正在使用的缓冲区大小进行任何物理控制,并且此错误表明接收缓冲区太小而无法接收消息。

如果没有完整的异常堆栈,并且不知道您当前的版本,很难判断,但您可以尝试升级到最新的 MQ 7.5 修复包 7.5.0.3。

或者您可以在 IBM 支持下打开 PMR 进行调查。

【讨论】:

  • 感谢 Tim,我们正在使用 spring 集成版本 4、MQ 7.5 和 MQ 8 客户端 jar。正如您所说,我们无法控制通过弹簧集成传递缓冲区大小。我可以使用 talend 作业读取消息,因此建议 MQ 服务器设置正确,我检查了 MaxMsgLen,一切设置正确。
  • 但是您使用的是哪个版本的 MQ?您的意思是 7.5 队列管理器和 8.0 客户端吗?确切的版本是什么? 7.5.0.3 和 8.0.0.0?
【解决方案2】:

应用程序缓冲区对于您的消息来说似乎太小了。 http://www-01.ibm.com/support/docview.wss?uid=swg21167205

【讨论】:

    猜你喜欢
    • 2017-09-10
    • 2013-10-20
    • 2018-03-12
    • 2021-10-03
    • 1970-01-01
    • 1970-01-01
    • 2022-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多