如果我们可以配置int-jms:outbound-channel-adapter以将值返回给调用者(可以是虚拟值),请告诉我 . 我有标头增强器,它在内部调用jms出站适配器向有效mq发送消息 . 我能够将消息发送到MQ,但由于jms适配器没有返回,因此不会执行标头扩充器之后的步骤 . 以下是我的配置
<int:header-enricher input-channel="inputMessageChannel" output-channel="messagePublishChannel">
<int:header name="message_success" expression="@gateway.exchange(#root).payload" />
</int:header-enricher>
<int:header-value-router input-channel="messagePublishChannel" header-name="mqstatus">
<int:mapping value="success" channel="responseCreatorChannel" />
<int:mapping value="failure" channel="errorChannel" />
</int:header-value-router>
<int:gateway id="gateway" default-request-channel="getQdetails" />
<int:chain input-channel="getQdetails">
<int:service-activator ref="rdrBusinessRulesValidationService" method="transform" />
<int-xml:marshalling-transformer marshaller="marshaller" result-transformer="messageResultTransformer">
</int-xml:marshalling-transformer>
<int:header-value-router header-name="region">
<int:mapping value="USA" channel="region1Channel" />
<int:mapping value="PRI" channel="region2Channel" />
</int:header-value-router>
</int:chain>
<int-jms:outbound-channel-adapter channel="region1Channel" connection-factory="activeMqconnectionFactory" destination="region1Destination">
<int-jms:request-handler-advice-chain>
<bean class="org.springframework.integration.handler.advice.ExpressionEvaluatingRequestHandlerAdvice">
<property name="onSuccessExpression" value="@service.setSuccess(#root)" />
<property name="onFailureExpression" value="@service.setFailure(#root)" />
</bean>
</int-jms:request-handler-advice-chain>
</int-jms:outbound-channel-adapter>
1 回答
您无需从任何出站通道适配器返回任何内容 . 它们完全不适合这种行为 .
您只需将PublishSubscribeChannel配置为Header Enricher的
output-channel
,并为此创建两个订阅者 . 第一个仍然是您的JMS出站通道适配器 . 您希望在发送JMS消息后执行的另一个 .注意:将向两个订阅者发送相同的消息 .
UPDATE
好 . 感谢您分享配置 . 现在我明白你的意思了 .
您的用例是通过
<gateway>
调用来丰富带有标头的消息 . 但由于<int-jms:outbound-channel-adapter>
是单向组件,因此您没有收到任何回复 .我不确定你将代表什么作为
message_success
Headers ,但我看到你可以将getQdetails
作为<publish-subscribe-channel>
并将第二个订阅者(与<chain>
一起)添加为:并且与顶级
header-enricher
的输入相同的消息将被发送回message_success
标头 .UPDATE2
根据你的要求,顶级 Headers 的
true/false
值我可以建议像这样的东西而不是publish-subscriber-channel
:那么,我在这里做什么:
而不是你的服务来丰富
ExpressionEvaluatingRequestHandlerAdvice
中的 Headers 我只是根据success/failure
状态返回boolean
.在成功的情况下,
ExpressionEvaluatingRequestHandlerAdvice
发送AdviceMessage
,但没有requestMessage
Headers 的副本 .因此,智能
<chain input-channel="toReplySuccess">
尝试恢复requestMessage
标头以访问标准replyChannel
机制 .我们在此处使用
Boolean.TRUE
payload
和来自AdviceMessage
的inputMessage
属性的标头构建新消息 .我们在这里使用
<bridge>
来真正发送回复你的顶级header-enricher
对于
toReplyFailure
,我们有类似的"smart"<chain>
但有点不同transformer
,只是因为失败时ExpressionEvaluatingRequestHandlerAdvice
发送ErrorMessage
,MessageHandlingExpressionEvaluatingAdviceException
为payload
,我们可以在异常的failedMessage
属性中找到requestMessage
所需的replyChannel
标头 .希望很清楚 .
UPDATE3