с использованием Boot 2.2.2 и Integration 5.2.2 - когда сообщение XML получено из File
и не удается выполнить демаршаллинг (т. Е. Это не XML), сообщение переходит, как ожидается, к errorChannel
. Однако, когда сообщение приходит из JMS по тому же маршруту каналов и не удается демаршировать, оно не маршрутизируется до errorChannel
, и сообщение откатывается в JMS. После чего я застрял в бесконечном l oop из SAXParseException
для одного и того же сообщения.
Я следовал этому примеру из Правильный окончательный способ перенести событие JMS при прослушивании Spring Integration с 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();
}