Spring Integration Transform Failure - откат JMS и переадресация на канал ошибок - PullRequest
0 голосов
/ 04 мая 2020

с использованием 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();
    }

1 Ответ

1 голос
/ 04 мая 2020

Вам необходимо добавить .errorChannel(...) к адаптеру канала, управляемого сообщениями.

...