У меня есть конфигурация для чтения данных из БД с использованием jdbc:inbound-channel-adapter
. Конфигурация:Весна Интеграция: Poller действует weird
<int-jdbc:inbound-channel-adapter query="SELECT * FROM requests WHERE processed_status = '' OR processed_status IS NULL LIMIT 5" channel="requestsJdbcChannel"
data-source="dataSource" update="UPDATE requests SET processed_status = 'INPROGRESS', date_processed = NOW() WHERE id IN (:id)" >
<int:poller fixed-rate="30000" />
</int-jdbc:inbound-channel-adapter>
<int:splitter input-channel="requestsJdbcChannel" output-channel="requestsQueueChannel"/>
<int:channel id="requestsQueueChannel">
<int:queue capacity="1000"/>
</int:channel>
<int:chain id="requestsChain" input-channel="requestsQueueChannel" output-channel="requestsApiChannel">
<int:poller max-messages-per-poll="1" fixed-rate="1000" />
.
.
</int:chain>
В описанной выше конфигурации, я определил Poller с JDBC fixed-rate
в 30 секунд. Когда есть прямой канал вместо requestsQueueChannel
, запрос выбора получает только 5 строк (так как я использую ограничение строк в select query) и ждет еще 30 секунд для следующего опроса.
Но после того, как я представил requestsQueueChannel
с очередью и добавил poller внутри requestsChain
, jdbc-inbound
не работает должным образом. Он не ждет еще 30 секунд для следующего опроса. Иногда он дважды проверяет БД в строке (в течение секунды), как если бы выполнялось 2 потока и получалось два набора строк из БД. Однако нет асинхронной передачи обслуживания, кроме указанных выше.
Мое понимание состоит в том, что даже если есть requestsQueueChannel
, то после выполнения запроса выбора он должен подождать еще 30 секунд для опроса БД. Есть что-то, чего я не вижу? Я просто хочу понять поведение этой конфигурации.
Учитывая, что это происходит дважды, это звучит так: http://stackoverflow.com/questions/25184355/how-to-prevent-duplicate-spring-integration-service-activations-when-polling-dir – Steve
Я думаю, что это не проблема здесь, поскольку прямой канал не имеет этой проблемы.Более того, он не читает дубликатов. Полллер работает в последовательности, а не 30 секунд. – nebula
Именно так себя ведут участники, если вы случайно загрузили свою конфигурацию в 2 контекста (web и root). Он не будет загружать дубликаты, потому что он обновляет 'обработанный_status' в базе данных, чтобы предотвратить это. Вы абсолютно уверены, что у вас нет двух контекстов? – Steve