inbound-channel-adapter - Как обновить поле строки при сбое?
У меня есть интеграция, которая начинается со стандартного запроса к базе данных, и она обновляет состояние в базе данных, чтобы указать, что интеграция работает нормально. Оно работает.
Но если данные не могут быть обработаны и возникла исключительная ситуация, состояние не обновляется должным образом, но я хотел бы обновить строку в моей базе данных с состоянием "KO", чтобы одна и та же строка не вызывала сбоев снова и снова.
Есть ли способ предоставить второй запрос для выполнения при сбое интеграции?
Мне кажется, что это очень стандартный способ делать вещи, но я не мог найти простой способ сделать это. Я мог бы ловить исключения на каждом этапе интеграции и обновлять базу данных, но это создает связь, поэтому должно быть другое решение.
Я перепробовал много поисков в Google, но ничего не смог найти, но я почти уверен, что ответ там.
На всякий случай, есть моя конфигурация xml для выполнения запроса к базе данных (ничего особенного):
<int-jdbc:inbound-channel-adapter auto-startup="true" data-source="datasource"
query="select * FROM MyTable where STATE='ToProcess')"
channel="stuffTransformerChannel"
update="UPDATE MyTable SET STATE='OK' where id in (:id)"
row-mapper="myRowMapper" max-rows-per-poll="1">
<int:poller fixed-rate="1000">
<int:transactional />
</int:poller>
</int-jdbc:inbound-channel-adapter>
Я использую Spring-Integration версии 4.0.0.RELEASE
1 ответ
Поскольку вы находитесь в Транзакции, это нормальное поведение, поэтому происходит возврат, и ваша БД возвращается в состояние очистки.
И в этом случае это классическая схема получения данных о целях приложения, а не какого-то встроенного инструмента. Вот почему мы не предоставляем on-error-update
потому что это не может быть прецедентом для всего.
Как только вы все равно обновите строку, вы должны onRallback
событие и сделать это в рамках новой транзакции. Однако он должен быть в том же потоке, чтобы предотвратить извлечение той же строки из второй задачи опроса.
Для этого мы предоставляем transaction-synchronization-factory
особенность:
<int-jdbc:inbound-channel-adapter max-rows-per-poll="1">
<int:poller fixed-rate="1000" max-messages-per-poll="1">
<int:transactional synchronization-factory="syncFactory"/>
</int:poller>
</int-jdbc:inbound-channel-adapter>
<int:transaction-synchronization-factory id="syncFactory">
<int:after-rollback channel="stuffErrorChannel"/>
</int:transaction-synchronization-factory>
<int-jdbc:outbound-channel-adapter
query="UPDATE MyTable SET STATE='KO' where id in (:payload[id])"
channel="stuffErrorChannel">
<int-jdbc:request-handler-advice-chain>
<tx:advice id="requiresNewTx">
<tx:attributes>
<tx:method name="handle*Message" propagation="REQUIRES_NEW"/>
</tx:attributes>
</tx:advice>
</int-jdbc:request-handler-advice-chain>
</int-jdbc:outbound-channel-adapter>
Надеюсь, я ясно