Spring integration Spring集成JMS出站通道适配器
请告诉我是否可以配置int-jms:outbound-channel-adapter以向调用者返回一个值(可以是一个伪值)。我有header enricher,它在内部调用jms出站适配器以向活动mq发送消息。我可以将消息发送到MQ,但由于jms适配器没有返回消息,因此不会执行头enricher之后的步骤。下面是我的配置Spring integration Spring集成JMS出站通道适配器,spring-integration,Spring Integration,请告诉我是否可以配置int-jms:outbound-channel-adapter以向调用者返回一个值(可以是一个伪值)。我有header enricher,它在内部调用jms出站适配器以向活动mq发送消息。我可以将消息发送到MQ,但由于jms适配器没有返回消息,因此不会执行头enricher之后的步骤。下面是我的配置 <int:header-enricher input-channel="inputMessageChannel" output-channel="message
<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>
您不需要从任何出站通道适配器返回任何内容。他们完全不打算这样做 您只需为您的Header Enricher配置一个
输出通道
,并为此创建两个订户。第一个仍然是JMS出站通道适配器。发送JMS消息后要执行的另一个操作
注意:将向两个订阅者发送相同的消息
更新
嗯。感谢您分享配置。现在我明白你的意思了
您的用例是在调用
后使用头来丰富消息。但是由于
是单向组件,因此您不会从那里收到任何回复
我不确定您要将什么表示为消息\u success
头,但我发现您可以将getQdetails
作为
并添加第二个订户(与该
一起),如下所示:
所以,我在这里做的是:
success/failure
状态返回boolean
,而不是在expressionevaluationrequesthandleradvice
中丰富标题的服务expressionEvaluationRequestHandlerAdvice
发送一条AdviceMessage
,而不发送requestMessage
头的副本
尝试还原requestMessage
头,以访问标准replyChannel
机制AdviceMessage
的inputMessage
属性的Boolean.TRUE
payload
和头构建一条新消息
将回复发送给顶级标题enricher
toReplyFailure
我们有类似的“smart”
,但与变压器有一点不同,这仅仅是因为在发生故障时,表达式EvaluationRequestHandlerAdvice
发送一条错误消息,其中消息HandlingExpressionEvaluationAdviceException
作为有效载荷,我们可以在异常的failedMessage
属性中找到带有所需replyChannel
标题的requestMessage
<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"/>
您不需要从任何出站通道适配器返回任何内容。他们完全不打算这样做 您只需为您的Header Enricher配置一个
输出通道
,并为此创建两个订户。第一个仍然是JMS出站通道适配器。发送JMS消息后要执行的另一个操作
注意:将向两个订阅者发送相同的消息
更新
嗯。感谢您分享配置。现在我明白你的意思了
您的用例是在调用
后使用头来丰富消息。但是由于
是单向组件,因此您不会从那里收到任何回复
我不确定您要将什么表示为消息\u success
头,但我发现您可以将getQdetails
作为
并添加第二个订户(与该
一起),如下所示:
所以,我在这里做的是:
success/failure
状态返回boolean
,而不是在expressionevaluationrequesthandleradvice
中丰富标题的服务expressionEvaluationRequestHandlerAdvice
发送一条AdviceMessage
,而不发送requestMessage
头的副本
尝试还原requestMessage
头,以访问标准replyChannel
机制AdviceMessage
的inputMessage
属性的Boolean.TRUE
payload
和头构建一条新消息
将回复发送给顶级标题enricher
toReplyFailure
我们有类似的“smart”
,但与变压器有一点不同,这仅仅是因为在发生故障时,表达式EvaluationRequestHandlerAdvice
发送一条错误消息,其中消息HandlingExpressionEvaluationAdviceException
作为有效载荷,我们可以在异常的failedMessage
属性中找到带有所需replyChannel
标题的requestMessage
<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"/>
<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"/>