Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring integration 如何将原始消息负载发送到jms错误队列_Spring Integration - Fatal编程技术网

Spring integration 如何将原始消息负载发送到jms错误队列

Spring integration 如何将原始消息负载发送到jms错误队列,spring-integration,Spring Integration,在下面的Spring集成消息流示例中,我需要能够重新处理原始消息。我有例外的地方之一是在转换器中或在最后对web服务的调用中。因此,到目前为止,我所看到的是,一旦通过转换器或服务更改了有效负载,我就无法回滚到放在jms队列上的原始消息。是否有一种功能允许我在发生异常时将原始消息发送到不同的jms队列 <int-jms:message-driven-channel-adapter id="Jms" connection-factory="connection

在下面的Spring集成消息流示例中,我需要能够重新处理原始消息。我有例外的地方之一是在转换器中或在最后对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;
    }

@变压器
公共消息handleFaileOrder(消息消息)抛出JAXBEException、IOException{
log.info(message.getPayload().getMessage());
JAXBElement test=(JAXBElement)message.getPayload().getFailedMessage().getPayload();
字符串xml=jaxbMarshalToString(test.getValue());
messageOut=MessageBuilder.withPayload(xml).setHeader(“异常”,Message.getPayload().getMessage()).build();
返回消息输出;
}

从您的配置中不清楚什么是
addChannel
,但只要您使用
error channel=“errorChannel”
,原始消息(我猜它是XML)将作为
MessaginException
failedMessage
发送到
errorChannel

如果您的
handleFailedOrder
errorChannel
,则您的
消息.getPayload().getFailedMessage().getPayload()
应该是原始XML,而不是取消签名的
CustomerRequestVO

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


但是,当然,您应该记住,同一可变对象的副本将在任何地方更改,您将更改其属性一次。

由于某些原因,我无法从message.getPayload().getFailedMessage().getPayload()获取原始xml。好的,请打开,调试
org.springframework.integration
并显示
errorChannel
的日志,如果您认为没有获得正确的XML负载。