【问题标题】:Spring Integration JMS Outbound channel adapterSpring Integration JMS 出站通道适配器
【发布时间】:2016-07-19 03:28:47
【问题描述】:

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

【问题讨论】:

    标签: spring-integration


    【解决方案1】:

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

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

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

    更新

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

    您的用例是使用 &lt;gateway&gt; 调用的结果来丰富消息的标题。但由于&lt;int-jms:outbound-channel-adapter&gt; 是单向组件,您不会从那里收到任何回复。

    我不确定您将用message_success 标头表示什么,但我看到您可以将getQdetails 设置为&lt;publish-subscribe-channel&gt; 并添加第二个订阅者(与&lt;chain&gt; 一起)作为:

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

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

    更新2

    根据您对顶级标题的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. 我只是根据success/failure 状态返回boolean,而不是您的服务来丰富ExpressionEvaluatingRequestHandlerAdvice 中的标头。

    2. 在成功的情况下,ExpressionEvaluatingRequestHandlerAdvice 发送一个没有 requestMessage 标头副本的 AdviceMessage

    3. 所以,智能 &lt;chain input-channel="toReplySuccess"&gt; 尝试恢复 requestMessage 标头以访问标准 replyChannel 机制。

    4. 我们在这里使用Boolean.TRUE payload 和来自传入AdviceMessageinputMessage 属性的标头构建一个新消息。

    5. 我们在这里进一步使用&lt;bridge&gt; 来真正将回复发送到您的顶级header-enricher

    6. 1234563 987654357@,在这里我们可以在异常的failedMessage 属性中找到带有所需replyChannel 标头的requestMessage

    希望这很清楚。

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

    【讨论】:

    • 下面是我的配置
    • :链>
    • 您好,Artem。非常感谢您提供的详细信息。但是我们可以在“链”中给“桥”吗?它给我带来了错误。我正在使用 SI 4.0.5
    • 嗨,Artem,我找到了与通用消息相关的问题的 RC。我的配置包含 。因此,如果启用了历史记录,方法 AbstractMessageChannel.send(Message> message, long timeout) 具有返回通用消息的逻辑。 if (this.shouldTrack) { message = MessageHistory.write(message, this, this.getMessageBuilderFactory()); }。这导致了这个问题。这是一个错误吗?
    猜你喜欢
    • 2015-05-01
    • 2014-06-29
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-24
    • 1970-01-01
    • 2015-11-26
    相关资源
    最近更新 更多