如果我们可以配置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>
答案 0 :(得分:0)
您不需要从任何出站渠道适配器返回任何内容。他们完全不打算这样做。
您只需将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
标题。
<强> UPDATE2 强>
根据您的要求,顶级标题的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>
那么,我在这里做什么:
我只是根据ExpressionEvaluatingRequestHandlerAdvice
状态返回boolean
,而不是您在success/failure
中丰富标题的服务。
在成功案例中,ExpressionEvaluatingRequestHandlerAdvice
发送的AdviceMessage
没有requestMessage
标题的副本。
因此,智能<chain input-channel="toReplySuccess">
尝试恢复requestMessage
标头以获取对标准replyChannel
机制的访问权。
我们在这里使用Boolean.TRUE
payload
和来自inputMessage
的{{1}}属性的标头构建了一条新邮件。
我们在此处进一步使用AdviceMessage
来真正向您的顶级<bridge>
发送回复
对于header-enricher
我们有类似的&#34; smart&#34; toReplyFailure
但<chain>
略有不同,只是因为失败时transformer
发送ExpressionEvaluatingRequestHandlerAdvice
ErrorMessage
作为MessageHandlingExpressionEvaluatingAdviceException
,我们可以在异常的payload
属性中找到包含所需requestMessage
标头的replyChannel
。
希望很清楚。
<强> UPDATE3 强>
failedMessage