Определение резервного поведения при исключении для ContentEnricher в Spring Integration

У меня есть хороший поток, определенный с помощью Spring Integration, в номинальном случае он работает так, как я хочу.

Однако я еще не нашел способа определить поведение для обработки ошибки (т.е. пометить входную строку как неудачную).

Вот ошибка, которую я получаю:

 [ask-scheduler-2] cMessagingTemplate$TemporaryReplyChannel : Reply message received but the receiving thread has exited due to an exception while sending the request message:ErrorMessage [payload=org.springframework.messaging.MessageHandlingException: error occurred in message handler [outboundGateway]; nested exception is...

Вот моя конфигурация потока (упрощенная):

@Configuration
@EnableIntegration
public class IntegrationConfig {


    @Autowired
    private DataSource dataSource;

    @Bean
    public IntegrationFlow mainFlow() {
        //noinspection unchecked
        return IntegrationFlows.from(jdbcMessageSource(),
                c -> c.poller(Pollers.fixedRate(5000)
                        .transactional(transactionManager())))
                .split()
                .enrich(e -> e
                        .requestChannel(subChannel())
                        .requestPayload(Message::getPayload)
                        .propertyExpression("fooId", "payload.id"))
                .handle(barHandler())
                .get();
    }

    @Bean
    public IntegrationFlow enricherFlow() {
        return IntegrationFlows.from(subChannel())
                .handle(outboundGateway())
                .get();
    }

    @Bean
    public MessageChannel subChannel() {
        return new DirectChannel();
    }

    @Bean
    public MessageSource<Object> jdbcMessageSource() {
        return new JdbcPollingChannelAdapter(this.dataSource,
                "select * from FOO");
    }

    @Bean
    public JdbcOutboundGateway outboundGateway() {
        ...
    }

    @Bean
    public JdbcMessageHandler barHandler() {
        return new JdbcMessageHandler(dataSource,
                "INSERT INTO BAR ...");
    }


    @Bean
    public PlatformTransactionManager transactionManager() {
        return new DataSourceTransactionManager(dataSource);
    }
}

Я бы подумал, что могу получить ошибки в errorChannel по умолчанию и выполнить там необходимые задачи, но я не нашел способа заставить эту работу.

Любые идеи и помощь приветствуются!


person ahelix    schedule 19.01.2018    source источник


Ответы (1)


Вы знаете, похоже, мы упустили возможность раскрыть errorChannel для EnricherSpec в Java DSL - не стесняйтесь поднимать вопрос JIRA по этому поводу. Но в любом случае похоже, что мы можем получить доступ к этому свойству:

.enrich(e -> {
            ContentEnricher contentEnricher =
                    e.requestChannel(subChannel())
                            .requestPayload(Message::getPayload)
                            .propertyExpression("fooId", "payload.id"))
                            .get().getT2();
            contentEnricher.setErrorChannel(enricherErrorChannel());
        })

Теперь вы можете добавить любой .handle() поток к этому enricherErrorChannel() и обрабатывать ErrorMessage во время ловли рыбы. Например, обычно ErrorMessage содержит payload как MessagingException, где у нас есть свойство failedMessage. И именно в нем содержится информация о ваших исходных payload и headers:

https://docs.spring.io/spring-integration/docs/5.0.0.RELEASE/reference/html/configuration.html#namespace-errorhandler

person Artem Bilan    schedule 19.01.2018
comment
Я понял это в то же время, спасибо, и вот вы: jira.spring.io/ browse / INT-4383 и github.com/spring-projects/ пружина-интеграция / тяга / 2335 - person ahelix; 19.01.2018