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