#spring-integration
#spring-интеграция
Вопрос:
У меня есть poller
, который запускается каждые x секунд. Я хотел бы контролировать start/stop
poller
, а также иметь возможность запускать его только один раз. Внешний вызов должен иметь возможность управлять этим.
- Запустите опрос и продолжайте опрос каждые x интервалов
- Остановите опрос
- Опрос только один раз и остановка -> Как это сделать?
Опрос выполняется с помощью a inbound-channel-adapter
с a poller
. Я опрашиваю данные конфигурации внешних систем, к которым подключаются нисходящие потоки, чтобы получать данные и направлять их в другие системы
Я могу либо использовать методы жизненного цикла опросника, либо шину управления в том же контексте для настройки вышеуказанных вызовов.
Как я могу запустить эту логику? Опросник будет выполняться в kubernetes. Некоторые параметры:
- HTTP
- Привод
- ?
Ответ №1:
Насколько я знаю, привод загрузки Spring в любом случае основан на конечных точках HTTP. итак, технически никакой разницы с точки зрения конечного пользователя.
Если вы действительно можете написать какую-либо службу REST с помощью команд, подобных описанию, тогда вы действительно можете внедрить a SourcePollingChannelAdapter
в эту службу и делегировать ее start()
and stop()
.
Я думаю, что «опрос только один раз» вы можете выполнить с помощью логической переменной состояния, с которой вы можете проконсультироваться из MessageSourceMutator.beforeReceive()
рекомендаций, введенных в этот опрос. Таким образом, вы оставите обычный триггер опроса нетронутым.
См. Также Поддержку JMS (если она доступна в Kubernetes): https://docs.spring.io/spring-integration/docs/5.3.2.RELEASE/reference/html/system-management.html#jmx-mbean-exporter
Комментарии:
1. Спасибо за решения. Я попробую подходы и опубликую свою реализацию здесь. Для
poll only once
, у меня уже естьReceiveMessageAdvice
, чтобы избежать дублирования сеансов опроса. Любые другие варианты в рамках, какие-либо предложения?2. Вы также можете взглянуть на
CompoundTrigger
so, всякий раз, когда вам нужно «только один раз», вы вызываете егоsetOverride()
для некоторойOnlyOnceTrigger
реализации (вы можете найти некоторые в рамках). В противном случае вы сбрасываете его,null
чтобы позволить обычному триггеру выполнить задание.3.
OnlyOnceTrigger
находится в тестовом пакетеorg.springframework.integration.test.util
. Кажется немного странным включать класс тестового пакета в основную логику. Может быть, в будущем его можно перенести в основные пакеты?4. Ну, это действительно для целей тестирования. Я показал вам это как место для заимствования идей