我有 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>
答案 0 :(得分:1)
使用<reply-listener/>
,回复始终在单独的线程(由回复侦听器容器拥有)上传递给网关;它被移交给等待网关内部回复的第一个线程。所以其他事情正在发生;您需要显示完整的堆栈跟踪和配置。
您不需要设置replyTo
和correlationId
标头;网关将负责所有这些。