Канал вывода и ошибок после выполнения любого / всех сервисных активаторов - PullRequest
0 голосов
/ 20 декабря 2018

Я хотел бы выполнить что-либо после завершения обслуживания любого / всех активаторов службы.Поток определяется следующим образом:

@Bean
public IntegrationFlow myFlow(MessageSource<Object> someMessageSource) {
    return IntegrationFlows.from(someMessageSource,
            c -> c.poller(Pollers.fixedRate(1, SECONDS)
                    .maxMessagesPerPoll(10)))
            .channel(mySourceChannel())
            .get();
}

@Bean
public MessageChannel mySourceChannel() {
    return new ExecutorChannel(executor());
}

Два активатора службы определены как

public static class MyFooActivator {  
    @ServiceActivator(inputChannel = "mySourceChannel")
    public void doSomething(FooTask event) {
      //handle foo task
    }
}

public static class MyBarActivator { 
    @ServiceActivator(inputChannel = "mySourceChannel")
    public void doSomething(BarTask event) {
        // handle bar task
    }
}

Как видите, активаторы службы не определяются как часть потока интеграции, а черезаннотаций.Цель состоит в том, чтобы выполнить некоторый фрагмент кода, когда 1) выполнение активатора службы было успешным 2) когда выполнение активатора службы не было успешным.

Если исполнитель службы известен / определен с потоком, это может быть достигнуто путем определения другогопоток и добавить выходной канал и ошибку.Не уверен, как добиться того же в моем случае.

1 Ответ

0 голосов
/ 20 декабря 2018

Прежде всего вам необходимо понять, что при наличии подписчиков на эту mySourceChannel вы получите балансировку между ними, когда первое сообщение направляется первому активатору службы, а следующее -второй.И так по нечетно-четной манере.Итак, вы должны быть уверены, что это именно то, что вы делаете, кроме такой конфигурации.

Чтобы провести некоторый анализ результата выполнения активатора службы, вам нужно использовать ExpressionEvaluatingRequestHandlerAdvice.Он имеет опции successChannel и failureChannel вместе с соответствующими выражениями, если это необходимо.

Вы можете вставить ссылку на его bean-компонент в атрибут adviceChain @ServiceActivator.Примерно так:

    @Bean
    @ServiceActivator(inputChannel = "myHandlerChannel", adviceChain = "myHandlerAdvice")
    public MessageHandler myHandler() {
        return message -> { };
    }

    @Bean
    public Advice myHandlerAdvice() {
        ExpressionEvaluatingRequestHandlerAdvice advice = new ExpressionEvaluatingRequestHandlerAdvice();
        advice.setOnSuccessExpressionString("payload");
        advice.setSuccessChannel(myHandlerSuccessChannel());
        return advice;
    }

Больше информации в Справочном руководстве: https://docs.spring.io/spring-integration/reference/html/messaging-endpoints-chapter.html#expression-advice

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...