В Java DSL Spring Integration нам всем не хватает того, что одним из очень важных компонентов в Spring Integration является MessageChannel
. И дело в том, что каналы могут добавляться в поток всякий раз, когда нам нужно больше, чем значение по умолчанию DirectChannel
. Для асинхронного выполнения у нас есть ExecutorChannel
. Но прежде чем мы пойдем по этому разветвленному потоку, нам нужно как-то прыгнуть туда, не нарушая основного. С точки зрения EIP это называется Wire-Tap: https://www.enterpriseintegrationpatterns.com/patterns/messaging/WireTap.html.
Spring Integration Java DSL предлагает реализацию, подобную оператору .wireTap()
в потоке. Логика аудита может быть реализована в подключенном потоке или по каналу, но не забывайте о ExecutorChannel
!
Вы можете увидеть больше информации в Справочном руководстве: https://docs.spring.io/spring-integration/reference/html/java-dsl.html#java-dsl-wiretap
UPDATE
.handle(buildItems)
.wireTap(log())
- правильный путь: вы собираетесь проверить результат buildItems
и перейти к следующему шагу.
log()
необходимо изменить следующим образом:
@Bean
public IntegrationFlow log() {
return f -> f.channel(c -> c.executor(taskExecutorBean())).handle(auditProcessor).channel("nullChannel");
}
Обратите внимание на c.executor()
. Таким образом, мы добавляем асинхронную передачу для нашего подпотока log()
.