Spring integration Spring集成转换失败回滚JMS且未转发到错误通道

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,并从传入队列提交

使用Boot 2.2.2和Integration 5.2.2-当一条XML消息源于
文件
且未能解组(即,它不是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调用中的有效负载转换,而不是流的下游。如果检测到暂时错误,错误流可能引发异常,消息将被重新查询。