Канал Spring Integration Executor с использованием примера кода аннотаций - PullRequest
0 голосов
/ 25 мая 2018

Моя системная диаграмма прилагается.

Системная диаграмма

КАК РАБОТАЕТ ПОТОК:

Поток интеграции пружинычитает входные данные из файла json на C: \ и выполняет 2 действия:

  1. Сохранение в БД

  2. Уведомление / печать для пользователя

ВАЖНЫЕ КРИТЕРИИ:

Я хочу, чтобы хранилище в потоке БД не зависело от бизнес-логики (печать для пользователя / уведомления), т. Е. БД exception/DBуспех не должен влиять на уведомление пользователя.

Аналогичным образом уведомление пользователя не должно влиять на поток данных.

Я просмотрел и обнаружил, что должен использовать канал исполнителя для передачи «хранилища в БД» другому.нить.

Я не могу найти пример кода для канала выполнения. Мне нужен ТОЛЬКО код, основанный на АННОТАЦИЯХ, поскольку все остальные классы основаны на аннотациях .

ЧТО МНЕ НУЖНО: Пример кода из ExecutorChannel - на основе аннотаций.

Код внутри 2 (считывает json из файла и отправляет его в БД, логика собственного дела)

@Bean
public IntegrationFlow readFromJSONFile() {
    return IntegrationFlows
            .from("/path/to/File")
            .transform("Transformer to convert to Bean")
            .wireTap(
                    flow -> flow.handle(msg -> logger
                            .info("Message sent to common channel: " + msg.getPayload())))
                            .channel("Common Channel Name")
                            .get();
    }

Код внутри 4:

@Bean
    public IntegrationFlow sendToDb() {

    return IntegrationFlows
            .from("Common Channel Name")
            .handle("DAO Impl to store into DB") // I THINK THE MESSAGE SHOULD BE SENT TO AN EXECUTOR CHANNEL TO PROCESS ON A SEPARATE THREAD
            .get();
    }

Код внутри 5:

@Bean
public IntegrationFlow sendToBusinessLogictoNotifyUser() {

    return IntegrationFlows
            .from("Common Channel Name")
            .handle("Business Logic Class name")
                            .get();
    }       

Текущее поведение: Если есть исключение БД, уведомить пользователя также не удается.Вместо этого я хочу, чтобы это было тихо зарегистрировано.

ПРИМЕЧАНИЕ: Мне нужен пример только аннотации.

1 Ответ

0 голосов
/ 26 мая 2018

Вам не нужно ExecutorChannel - просто установите ignoreFailures на true в пабе / подканале ...

/**
 * Specify whether failures for one or more of the handlers should be
 * ignored. By default this is <code>false</code> meaning that an Exception
 * will be thrown whenever a handler fails. To override this and suppress
 * Exceptions, set the value to <code>true</code>.
 * @param ignoreFailures true if failures should be ignored.
 */
public void setIgnoreFailures(boolean ignoreFailures) {

Если вы хотите регистрировать или обрабатывать исключения другим способомв хранилище БД вы можете добавить ExpressionEvaluatingRequesthandlerAdvice к компоненту, который хранит БД.

Если вам действительно нужен ExecutorChannel, в разделе DSL справочного руководства приведен пример .

.channel(MessageChannels.executor("executorChannel", this.taskExecutor))
...