Spring Integration: Динамическое переключение маршрутизации - PullRequest
0 голосов
/ 15 марта 2019

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

Если целевая система не работает, мы останавливаем входящие адаптеры, но также хотели бысохранить локально или переслать текущие конвертированные сообщения «в полете».Для этого просто хотелось бы перенаправить сообщения из обычного выходного канала в какой-нибудь резервный канал динамически.

В документах я нашел только опцию для маршрутизации сообщений на основе их заголовков (поэтому на каком-то шаге перед потоком я должен был бы добавить их динамически, когда система targer нев зависимости от типа полезной нагрузки, что на самом деле не мой случай.Случай с динамическим добавлением некоторого заголовка и последующей его фильтрацией по конвейеру или во время десериализации / сериализации все еще кажется мне не лучшим подходом.Я бы предпочел иметь возможность включить коммутатор (на каком-то внутреннем событии), который затем перенаправил бы эти сообщения «в полете» на «резервный» канал.

Каков наилучший подход СИ для достижения этой цели?Спасибо!

1 Ответ

0 голосов
/ 15 марта 2019

Маршрутизатор может быть основан не только на типе полезной нагрузки или каком-либо заголовке. Вы действительно можете иметь общий вызов метода POJO для возврата канала, его имени или некоторого ключа маршрутизации, который отображается. Этот метод POJO действительно может проверить некоторое внутреннее состояние системы и создать тот или иной ключ маршрутизации.

Итак, у вас может быть что-то подобное в конфигурации маршрутизатора:

.route(myRouter())

где ваш myRouter примерно такой:

@Bean
MyRouter myRouter() {
   return;
}

и его внутренний код может быть таким:

public class MyRouter {


    @Autowired
    private SystemState systemState;

    String route(Object payload) {
       return this.systemState.isActive() ? "successChannel" : "backupChannel";
    }
}

То же самое можно получить простым лямбда-определением:

 .<Object, Boolean>route(p -> systemState().isActive(),
                  m -> m.channelMapping(true, "sucessChannel")
                         .channelMapping(false, "backupChannel"))

Кроме того ... * * 1016

private final AtomicBoolean switcher = new AtomicBoolean();

@Bean
public IntegrationFlow flow() {
    return IntegrationFlows.from(() -> "foo", e -> e.poller(Pollers.fixedDelay(Duration.ofSeconds(5))))
            .route(s -> switcher.get() ? "foo" : "bar")
            .get();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...