Проблемы при попытке изменить частоту опроса во время выполнения с помощью Spring Integration - PullRequest
1 голос
/ 01 февраля 2012

Определив адаптер канала как:

<int:channel id="target">
    <int:queue /> 
</int:channel>
<int-jdbc:inbound-channel-adapter id="adapter" channel="target" query="${int.poll.query}" update="${int.update.query}" data-source="mock-datasource">
    <int:poller fixed-rate="5000"/>
</int-jdbc:inbound-channel-adapter>

Интересно, почему я не могу изменить частоту опроса во время выполнения следующим образом:

SourcePollingChannelAdapter adapter = applicationContext.getBean("adapter",SourcePollingChannelAdapter.class);
adapter.setTrigger(new PeriodicTrigger(1000));

Когда я отлаживаю это решение, я вижу, что к адаптеру присоединен новый триггер, однако частота опроса остается неизменной (каждые 5 секунд). Я попытался также остановить () и запустить () адаптер, с такой же удачей.

Кто-нибудь может указать мне, что я делаю неправильно? Спасибо

Ответы [ 2 ]

4 голосов
/ 02 февраля 2012

[ RESOLVED ]

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

Я оставляю здесь изменения, сделанные в моемконфигурация:

<int-jdbc:inbound-channel-adapter id="bancsAdapter" channel="target" query="${int.bancs.poll.query}" update="${int.bancs.update.query}" data-source="bancsMockDB">
    <int:poller trigger="dynamicTrigger" />
</int-jdbc:inbound-channel-adapter>

<bean id="dynamicTrigger" class="directlabs.integration.DynamicTrigger">
    <constructor-arg value="5000" />
</bean>

Так что для регулирования вам нужно только сделать следующее:

applicationContext.getBean("dynamicTrigger",DynamicTrigger.class).setPeriod(1000);

Реализация DynamicTrigger может быть найдена здесь

Оригинальные комментарии от членов команды Spring можно найти здесь .

0 голосов
/ 11 июля 2015

Хотя здесь не хватает места для полного примера, мы создали Сервис, который использует Quartz Scheduler в качестве механизма запуска. Он принимает документ XML с определенными заданиями и триггерами Quartz (это переполнение стека описывает процесс Использование простого XML для управления Quartz Sheduler )

Входной канал примет XML, который будет использоваться для установки расписаний в кварце. Затем входной канал можно использовать для принятия динамических обновлений заданий и триггеров.

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

Мы постоянно используем этот Сервис во многих наших контекстах Spring Integration.

Надеюсь, это поможет.

...