Spring integration Spring集成JMS出站通道适配器

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-jms:outbound-channel-adapter以向调用者返回一个值(可以是一个伪值)。我有header enricher,它在内部调用jms出站适配器以向活动mq发送消息。我可以将消息发送到MQ,但由于jms适配器没有返回消息,因此不会执行头enricher之后的步骤。下面是我的配置

    <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

  • 希望这是明确的

    更新3

    <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

  • 希望这是明确的

    更新3

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