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

Spring integration Spring消息驱动通道适配器以及JMS出站网关,spring-integration,Spring Integration,我有一个jms:message-driven通道适配器,在其下游我有一个jms:outbound网关。 每当我在一个线程(如下所示)的通道适配器中获得消息时,就会出现问题 [org.springframework.jms.listener.DefaultMessageListenerContainer**#1-4**]和另一个therad中的网关响应,如下所示: [org.springframework.jms.listener.DefaultMessageListenerContainer**

我有一个jms:message-driven通道适配器,在其下游我有一个jms:outbound网关。 每当我在一个线程(如下所示)的通道适配器中获得消息时,就会出现问题

[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>

对于
,应答始终通过单独的线程(由应答侦听器容器拥有)传递到网关;它被移交给网关内等待回复的第一个线程。所以其他的事情正在发生;您需要显示完整的堆栈跟踪和配置


您不需要将
replyTo
correlationId
标题设置为;网关将处理所有这些问题。

正如您所说,导致此问题的原因是某些配置错误。由于以下原因,我正在指定correlationId。注意:使用关联时,关联数据包括表示网关的UUID以及消息标识符。因此,如果提供了明确的回复目的地,则使用需要指定“相关键”。“是的,需要在网关上指定一个
相关键来告诉它在哪里存储它,但是网关负责设置值(以及
replyTo
)。每当我将JMSCorrelationID指定为关联键时,调试日志会在消息转换为JMS消息后将JMSCorrelationID值设置为null。即使我显式指定JMS_correlationId标头,行为也是相同的。然而,如果我不指定任何值,它会将默认值设置为messageId。我不知道使用哪个选项来设置nsure消息返回到正确的使用者线程。如我所说,将
相关键设置为
JMSCorrelationID
,使网关自动使用内部网关相关,以便它可以处理异步回复。是的,转换后为null;转换后插入,但在发送之前插入。请参阅
JmsOutboundGateway.doSendAndReceiveAsync()。