Spring integration Spring集成转换失败回滚JMS且未转发到错误通道
使用Boot 2.2.2和Integration 5.2.2-当一条XML消息源于Spring integration Spring集成转换失败回滚JMS且未转发到错误通道,spring-integration,spring-jms,Spring Integration,Spring Jms,使用Boot 2.2.2和Integration 5.2.2-当一条XML消息源于文件且未能解组(即,它不是XML)时,消息将按照预期的错误通道进行。但是,当消息来自JMS时,通过相同的通道路由并未能解组,它被路由到errorChannel,消息被回滚到JMS。之后,对于同一条消息,我陷入了无尽的SAXParseException循环 我从一开始就遵循了这个例子。是否存在一些我没有考虑的隐含交易控制?如何让Spring Integration将消息转发到errorChannel,并从传入队列提交
文件
且未能解组(即,它不是XML)时,消息将按照预期的错误通道
进行。但是,当消息来自JMS时,通过相同的通道路由并未能解组,它被路由到errorChannel
,消息被回滚到JMS。之后,对于同一条消息,我陷入了无尽的SAXParseException
循环
我从一开始就遵循了这个例子。是否存在一些我没有考虑的隐含交易控制?如何让Spring Integration将消息转发到errorChannel
,并从传入队列提交“get”
守则简介如下:
@Bean
public IntegrationFlow fileReader() {
return IntegrationFlows
.from(
Files
.inboundAdapter( ... )
...
.get(), e -> e.poller(Pollers.fixedDelay(1000))
)
.transform(new FileToStringTransformer())
.channel("backUpChannel")
.get();
}
@Bean
public IntegrationFlow getMessageFromJms(ConnectionFactory connectionFactory, @Value("${queues.myQueue}") String myQueue) {
return IntegrationFlows.from(
Jms
.messageDrivenChannelAdapter(connectionFactory)
.destination(myQueue)
)
.channel("backUpChannel")
.get();
}
@Bean
public IntegrationFlow doBackUp() {
return IntegrationFlows
.from("backUpChannel")
.<String>handle((payload, headers) -> {
String uuid = headers.get(MessageHeaders.ID).toString();
File backUpFile = new File("c:/backup/" + uuid + ".txt");
byte[] payloadContent = payload.getBytes();
try {
java.nio.file.Files.write(backUpFile.toPath(), payloadContent);
} catch (IOException e) {
e.printStackTrace();
}
return payload;
})
.channel("XXX")
.get();
}
@Bean
public Jaxb2Marshaller unmarshaller() {
Jaxb2Marshaller unmarshaller = new Jaxb2Marshaller();
unmarshaller.setClassesToBeBound(MyClass.class);
return unmarshaller;
}
@Bean
public IntegrationFlow handleParseXml() {
return IntegrationFlows
.from("XXX")
.transform(new UnmarshallingTransformer(unmarshaller()))
.channel("YYY")
.get();
}
@Bean
公共集成流文件读取器(){
返回积分流
.来自(
文件夹
.inboundAdapter(…)
...
.get(),e->e.poller(Pollers.fixedDelay(1000))
)
.transform(新文件ToString Transformer())
.频道(“备份频道”)
.get();
}
@豆子
公共集成流getMessageFromJms(ConnectionFactory ConnectionFactory,@Value(${queues.myQueue}”)字符串myQueue){
返回IntegrationFlows.from(
Jms
.messageDrivenChannelAdapter(连接工厂)
.目的地(myQueue)
)
.频道(“备份频道”)
.get();
}
@豆子
公共集成流数据备份(){
返回积分流
.从(“备份通道”)
.handle((有效负载、标题)->{
字符串uuid=headers.get(MessageHeaders.ID).toString();
File backUpFile=新文件(“c:/backup/”+uuid+“.txt”);
byte[]payloadContent=payload.getBytes();
试一试{
java.nio.file.Files.write(backUpFile.toPath(),payloadContent);
}捕获(IOE异常){
e、 printStackTrace();
}
返回有效载荷;
})
.频道(“XXX”)
.get();
}
@豆子
公共Jaxb2Marshaller解组器(){
Jaxb2Marshaller unmarshaller=新的Jaxb2Marshaller();
unmarshaller.setClassesToBeBound(MyClass.class);
返回解组器;
}
@豆子
公共集成流handleParseXml(){
返回积分流
.来自(“XXX”)
.transform(新解组器Transformer(解组器()))
.频道(“YYY”)
.get();
}
您需要将.errorChannel(…)
添加到消息驱动通道适配器。感谢您的响应。我应该更加注意参考文件中的第23.2.1节。我只是假设它应用于JMS调用中的有效负载转换,而不是流的下游。如果检测到暂时错误,错误流可能引发异常,消息将被重新查询。