Spring Integration Transform故障回滚JMS,未转发到错误通道

问题描述 投票:0回答:1

使用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();
    }
spring-integration spring-jms
1个回答
1
投票

你需要添加 .errorChannel(...) 到消息驱动的通道适配器。

© www.soinside.com 2019 - 2024. All rights reserved.