【问题标题】:How to send original message payload to jms error queue如何将原始消息有效负载发送到 jms 错误队列
【发布时间】:2014-08-21 01:47:45
【问题描述】:

在下面的 Spring Integration 消息流示例中,我需要能够重新处理原始消息。我有例外的领域之一是变压器或最后对 Web 服务的调用。所以到目前为止我所看到的是,一旦通过转换器或服务更改了有效负载,我就无法回滚到放置在 jms 队列上的原始消息。是否有允许我在发生异常时将原始消息发送到不同的 jms 队列的功能?

<int-jms:message-driven-channel-adapter
        id="Jms" 
        connection-factory="connectionFactory"      
        destination="queue" 
        channel="XMLChannel"
        error-channel="errorChannel"

        />  

    <int:channel id="XMLChannel"/>  

    <int:chain input-channel="XMLChannel" output-channel="ObjectChannel">
        <int-xml:unmarshalling-transformer id="defaultUnmarshaller" unmarshaller="xmlMarshaller"  />
    </int:chain>    

    <int:channel id="ObjectChannel"/>

    <int:chain id="transformerChain" input-channel="ObjectChannel" output-channel="post" >

        <int:filter ref="environmentFilter" />
        <int:filter ref="emailFilter" />

        <int:transformer ref="transformer" />

        <int:object-to-json-transformer object-mapper="objectMapperFactory" />

        <int:header-enricher>
            <int:header name="content-type" value="application/json"></int:header>
        </int:header-enricher>

        <int-http:outbound-gateway 
            url="${url.${runtime.environment}}" 
            http-method="POST"
            expected-response-type="java.lang.String" 
            charset="UTF-8"
            reply-channel="post">
            <int-http:request-handler-advice-chain>
                <int:retry-advice max-attempts="3">
                    <int:exponential-back-off initial="5000"  multiplier="10.0" maximum="600000" />
                </int:retry-advice>
            </int-http:request-handler-advice-chain>
        </int-http:outbound-gateway>
    </int:chain>    

        <int:channel id="post"/>

        <int:logging-channel-adapter channel="post" level="INFO" log-full-message="true"/>

    <int:exception-type-router input-channel="addChannel" default-output-channel="errorChannel">
        <int:mapping />
    </int:exception-type-router>

    <int:channel id="errorChannel" />

    <int:chain input-channel="errorChannel">

        <int:transformer ref="errorTransformer"/>

    <!--        <int:object-to-json-transformer/>
     <int-xml:marshalling-transformer marshaller="xmlMarshaller"  /> -->
        <int-jms:outbound-channel-adapter id="dcsConsumerAppointmentError"
            connection-factory="connectionFactory" destination="dcsConsumerAppointmentErrorQueue" />

    </int:chain>




@Transformer
    public Message<?> handleFailedOrder(Message<MessageHandlingException> message) throws JAXBException, IOException {

        log.info(message.getPayload().getMessage());

        JAXBElement<CustomerRequestVO> test = (JAXBElement<CustomerRequestVO>) message.getPayload().getFailedMessage().getPayload();

        String xml = jaxbMarshalToString(test.getValue());

        Message<?> messageOut = MessageBuilder.withPayload(xml).setHeader("Exception", message.getPayload().getMessage()).build();

        return messageOut;
    }

【问题讨论】:

    标签: spring-integration


    【解决方案1】:

    从您的配置中不清楚addChannel 是什么,但就您使用error-channel="errorChannel" 而言,原始消息(我猜它是一个XML)将作为failedMessage 发送到errorChannel MessagingException

    如果您的handleFailedOrdererrorChannel&lt;int:transformer ref="errorTransformer"/&gt;,则您的message.getPayload().getFailedMessage().getPayload() 应该是原始XML,而不是未编组的CustomerRequestVO

    跟踪原始payload 的另一个技巧是在进一步处理和转换之前将其放入MessageHeaders

    但是,当然,您应该记住,同一个可变对象的副本会随处更改,您将更改其属性一次。

    【讨论】:

    • 由于某种原因,我没有从 message.getPayload().getFailedMessage().getPayload() 获取原始 xml。
    • 好吧,请打开,调试org.springframework.integration 并显示errorChannel 的日志,当你认为你没有得到正确的 XML 有效负载时。
    猜你喜欢
    • 2016-05-02
    • 2017-12-17
    • 2011-01-11
    • 1970-01-01
    • 1970-01-01
    • 2016-12-10
    • 1970-01-01
    • 2013-12-07
    • 1970-01-01
    相关资源
    最近更新 更多