首页 文章

Spring Integration JMS出站通道适配器

提问于
浏览
1

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

    您无需从任何出站通道适配器返回任何内容 . 它们完全不适合这种行为 .

    您只需将PublishSubscribeChannel配置为Header Enricher的 output-channel ,并为此创建两个订阅者 . 第一个仍然是您的JMS出站通道适配器 . 您希望在发送JMS消息后执行的另一个 .

    注意:将向两个订阅者发送相同的消息 .

    UPDATE

    好 . 感谢您分享配置 . 现在我明白你的意思了 .

    您的用例是通过 <gateway> 调用来丰富带有标头的消息 . 但由于 <int-jms:outbound-channel-adapter> 是单向组件,因此您没有收到任何回复 .

    我不确定你将代表什么作为 message_success Headers ,但我看到你可以将 getQdetails 作为 <publish-subscribe-channel> 并将第二个订阅者(与 <chain> 一起)添加为:

    <bridge input-channel="getQdetails" order="2"/>
    

    并且与顶级 header-enricher 的输入相同的消息将被发送回 message_success 标头 .

    UPDATE2

    根据你的要求,顶级 Headers 的 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 中的 Headers 我只是根据 success/failure 状态返回 boolean .

    • 在成功的情况下, ExpressionEvaluatingRequestHandlerAdvice 发送 AdviceMessage ,但没有 requestMessage Headers 的副本 .

    • 因此,智能 <chain input-channel="toReplySuccess"> 尝试恢复 requestMessage 标头以访问标准 replyChannel 机制 .

    • 我们在此处使用 Boolean.TRUE payload 和来自 AdviceMessageinputMessage 属性的标头构建新消息 .

    • 我们在这里使用 <bridge> 来真正发送回复你的顶级 header-enricher

    • 对于 toReplyFailure ,我们有类似的"smart" <chain> 但有点不同 transformer ,只是因为失败时 ExpressionEvaluatingRequestHandlerAdvice 发送 ErrorMessageMessageHandlingExpressionEvaluatingAdviceExceptionpayload ,我们可以在异常的 failedMessage 属性中找到 requestMessage 所需的 replyChannel 标头 .

    希望很清楚 .

    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"/>
    

相关问题