Spring Integration JMS出站通道适配器

时间:2016-03-30 21:59:20

标签: spring-integration

如果我们可以配置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 个答案:

答案 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>

那么,我在这里做什么:

  1. 我只是根据ExpressionEvaluatingRequestHandlerAdvice状态返回boolean,而不是您在success/failure中丰富标题的服务。

  2. 在成功案例中,ExpressionEvaluatingRequestHandlerAdvice发送的AdviceMessage没有requestMessage标题的副本。

  3. 因此,智能<chain input-channel="toReplySuccess">尝试恢复requestMessage标头以获取对标准replyChannel机制的访问权。

  4. 我们在这里使用Boolean.TRUE payload和来自inputMessage的{​​{1}}属性的标头构建了一条新邮件。

  5. 我们在此处进一步使用AdviceMessage来真正向您的顶级<bridge>发送回复

  6. 对于header-enricher我们有类似的&#34; smart&#34; toReplyFailure<chain>略有不同,只是因为失败时transformer发送ExpressionEvaluatingRequestHandlerAdvice ErrorMessage作为MessageHandlingExpressionEvaluatingAdviceException,我们可以在异常的payload属性中找到包含所需requestMessage标头的replyChannel

  7. 希望很清楚。

    <强> UPDATE3

    failedMessage