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>

Надеюсь, я ясно

Другие вопросы по тегам