使用Boot 2.2.2和Integration 5.2.2--当XML消息的来源是来自于 "Boot 2.2.2 "的时候。File
而未能解压缩(即它不是XML),该消息将按预期进行。errorChannel
. 然而,当消息来自JMS,通过相同的通道路线,解密失败时,它是 不 输送到 errorChannel
并将消息回滚到JMS。在这之后,我陷入了一个无休止的循环,即 SAXParseException
为相同的信息。
我曾按照这个例子从 将JMS事件监听迁移到Spring集成与Spring Boot的正确终极方法。 . 是否有一些我没有考虑到的隐含事务控制?我如何让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();
}
你需要添加 .errorChannel(...)
到消息驱动的通道适配器。