message-driven-channel-adapter:轮询队列中的false / phantom消息

时间:2016-01-13 13:19:33

标签: spring spring-integration ibm-mq

我们在日志中使用spring integration和daily,我们可以在下面看到stacktrace。其他JMS适配器工作正常,我们认为只有一个以下缺少一些东西:

Spring集成配置:

    <jms:message-driven-channel-adapter concurrent-consumers="1" id="jmsInLOAN" destination="queueLOAN" channel="LOANCommonDataChannel" acknowledge="transacted" /> 

请查看下面的Put和Msgs读取计数的MQ统计信息,应该有适配器读取的消息的确切数量。我担心Spring集成的消息驱动通道适配器从队列中读取额外的消息。任何帮助将不胜感激。

enter image description here

WARN  07/Jan/2016 09:04:15,438 [org.springframework.jms.listener.DefaultMessageListenerContainer#23-1] springframework.jms.listener.DefaultMessageListenerContainer - [SYSTEM_ID=HBUSLOANIQ] [MESSAGE_ID=null] Execution of JMS message listener failed, and no ErrorHandler has been set.
org.springframework.integration.MessagingException: unsupported payload type [com.ibm.jms.JMSMessage]
        at org.springframework.integration.xml.DefaultXmlPayloadConverter.convertToDocument(DefaultXmlPayloadConverter.java:76)
        at org.springframework.integration.xml.DefaultXmlPayloadConverter.convertToNode(DefaultXmlPayloadConverter.java:88)
        at org.springframework.integration.xml.router.XPathRouter.getChannelIdentifiers(XPathRouter.java:119)
        at org.springframework.integration.router.AbstractMessageRouter.determineTargetChannels(AbstractMessageRouter.java:247)
        at org.springframework.integration.router.AbstractMessageRouter.handleMessageInternal(AbstractMessageRouter.java:211)

2 个答案:

答案 0 :(得分:0)

看起来您正在将未转换的JMS消息(com.ibm.jms.JMSMessage)传递给XML Payload转换器......

org.springframework.integration.MessagingException: unsupported payload type [com.ibm.jms.JMSMessage]
    at org.springframework.integration.xml.DefaultXmlPayloadConverter.convertToDocument(DefaultXmlPayloadConverter.java:76)

也许您已将extract-payload设为false

虽然它不在您显示的配置中。

启用DEBUG日志记录将显示通过系统的消息的有效负载类型。

答案 1 :(得分:0)

问题是因为我们进入队列的有效和有毒(有一个有效载荷类型[com.ibm.jms.JMSMessage])消息。有效的消息处理得很好,但有些消息无法通过应用程序消化并发送到BackoutQueue。

在我们的例子中,BOQ阈值是3,这意味着我的应用程序将尝试消耗一个特定消息3次,如果消息退出3次,那么它将被移动到BOQ队列并且(msgs read - msgs put)/ 3 on LOAIQ = = msgs以该采样间隔放入BOQ队列。从放置在BOQ队列上的msgs,我们可以看到有多少消息从LOAIQ队列中退出。这就是为什么消息读取计数超过收到的消息数量的原因。 enter image description here