您不需要从任何出站通道适配器返回任何内容。它们完全不适合这种行为。
您只需将 PublishSubscribeChannel 配置为您的 Header Enricher 的 output-channel 并为此创建两个订阅者。第一个仍然是您的 JMS 出站通道适配器。另一个您希望在发送 JMS 消息后执行的操作。
注意:相同的消息将发送给两个订阅者。
更新
好的。谢谢分享配置。现在我明白你的意思了。
您的用例是使用 <gateway> 调用的结果来丰富消息的标题。但由于<int-jms:outbound-channel-adapter> 是单向组件,您不会从那里收到任何回复。
我不确定您将用message_success 标头表示什么,但我看到您可以将getQdetails 设置为<publish-subscribe-channel> 并添加第二个订阅者(与<chain> 一起)作为:
<bridge input-channel="getQdetails" order="2"/>
与顶级header-enricher 的输入相同的消息将被发送回message_success 标头。
更新2
根据您对顶级标题的true/false 值的要求,我可以建议这样的东西而不是publish-subscriber-channel:
<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="T(Boolean).TRUE" />
<property name="onFailureExpression" value="T(Boolean).FALSE" />
<property name="successChannel" ref="toReplySuccess" />
<property name="failureChannel" ref="toReplyFailure" />
<property name="trapException" ref="true" />
</bean>
</int-jms:request-handler-advice-chain>
</int-jms:outbound-channel-adapter>
<chain input-channel="toReplySuccess">
<transformer
expression="T(org.springframework.messaging.support.MessageBuilder).createMessage(payload, inputMessage.headers)" />
<bridge />
</chain>
<chain input-channel="toReplyFailure">
<transformer
expression="T(org.springframework.messaging.support.MessageBuilder).createMessage(payload.evaluationResult, payload.failedMessage.headers)" />
<bridge />
</chain>
那么,我在这里做什么:
我只是根据success/failure 状态返回boolean,而不是您的服务来丰富ExpressionEvaluatingRequestHandlerAdvice 中的标头。
在成功的情况下,ExpressionEvaluatingRequestHandlerAdvice 发送一个没有 requestMessage 标头副本的 AdviceMessage。
所以,智能 <chain input-channel="toReplySuccess"> 尝试恢复 requestMessage 标头以访问标准 replyChannel 机制。
我们在这里使用Boolean.TRUE payload 和来自传入AdviceMessage 的inputMessage 属性的标头构建一个新消息。
我们在这里进一步使用<bridge> 来真正将回复发送到您的顶级header-enricher
1234563 987654357@,在这里我们可以在异常的failedMessage 属性中找到带有所需replyChannel 标头的requestMessage。
希望这很清楚。
UPDATE3
<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="T(Boolean).TRUE" />
<property name="onFailureExpression" value="T(Boolean).FALSE" />
<property name="successChannel" ref="toReplySuccess" />
<property name="failureChannel" ref="toReplyFailure" />
<property name="trapException" ref="true" />
</bean>
</int-jms:request-handler-advice-chain>
</int-jms:outbound-channel-adapter>
<int:transformer input-channel="toReplySuccess" output-channel="toReplyChannel"
expression="T(org.springframework.messaging.support.MessageBuilder)
.createMessage(payload, inputMessage.headers)" />
<int:transformer input-channel="toReplyFailure"
expression="T(org.springframework.messaging.support.MessageBuilder)
.createMessage(payload.evaluationResult, payload.failedMessage.headers)" />
<int:bridge input-channel="toReplyChannel"/>