Spring消息驱动的通道适配器以及JMS出站网关

时间:2014-11-25 21:28:32

标签: spring-integration

我有 jms:消息驱动通道适配器,在其下游我有一个 jms:outbound-gateway 。 每当我在一个线程中的通道适配器中收到消息时就会出现问题

[org.springframework.jms.listener.DefaultMessageListenerContainer **#1-4 **]和另一个therad中的网关响应如下:

[org.springframework.jms.listener.DefaultMessageListenerContainer **#3-5 **]。

我得到一个奇怪的例外:

org.springframework.integration.MessageRejectedException:由于XML验证错误,邮件被拒绝;嵌套异常是org.springframework.integration.xml.AggregatedXmlMessageValidationException:多个原因:     cvc-elt.1:找不到元素声明' NS1:FindPermitsByPersonNoRes'。

但是每当两个线程ID都相同时,我就不会有任何异常。

以下是我的网关配置:

    <int:header-enricher>
        <int:header name="jms_replyTo" ref="outboundQueue" overwrite="true"/>
        <int:header name="jms_type" type="java.lang.String" value="1" overwrite="true" />
        <int:header name="jms_correlationId" type="java.lang.String" expression="T(java.util.UUID).randomUUID().toString()" overwrite="true" />
    </int:header-enricher>

    <jms:outbound-gateway 
        request-channel="gateway_request_channel"
        request-destination="inboundQueue"
        reply-destination="outboundQueue" 
        correlation-key="JMSCorrelationID"
        connection-factory="brokerConnectionFactory">

        <jms:reply-listener/>

    </jms:outbound-gateway>

1 个答案:

答案 0 :(得分:1)

使用<reply-listener/>,回复始终在单独的线程(由回复侦听器容器拥有)上传递给网关;它被移交给等待网关内部回复的第一个线程。所以其他事情正在发生;您需要显示完整的堆栈跟踪和配置。

您不需要设置replyTocorrelationId标头;网关将负责所有这些。