Spring integration Spring消息驱动通道适配器以及JMS出站网关
我有一个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相同,我就不会得到任何异常 下面是我的网关配置: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**
<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()。