Ниже приведен код задержки, который я использую в своем приложении. Выходной канал checkMessageInProgress - это вызов хранимой процедуры базы данных, которая проверяет, нужно ли обработать сообщение или отложить его. Если сообщение необходимо снова отложить, счетчик повторных попыток увеличивается. После 3-х задержек возникает пользовательское исключение приложения. Я использую jdbc Message Store для сообщений с задержкой. В сценарии, когда сообщение задерживается 3 раза и когда возникает исключение, сообщения не удаляются из таблиц баз данных, и сервер выбирает эти сообщения при перезапуске. Как сделать так, чтобы сообщение было удалено из таблицы в случаях, когда задержка происходит 3 раза

<int:chain input-channel="delayerChannel"
    output-channel="checkMessageInProgress">
    <int:header-enricher>
    <!-- Exception/ERROR handling for flows originating from Delayer -->
        <int:header name="errorChannel" value="exceptionChannel"
            overwrite="true" />
        <int:header name="retryCount" overwrite="true" type="int"
            expression="headers['retryCount'] == null ? 0 : headers['retryCount'] + 1" />
    </int:header-enricher>
    <!-- If retryCount maxed out -discard message and log it in error table -->
    <int:filter expression="(headers['retryCount'] lt 3)"
        discard-channel="raiseExceptionChannel">
    </int:filter>
    <!-- Configurable delay - fetch from property file -->
    <int:delayer id="Delayer" default-delay="${timeout}"
        message-store="mymessageStore">
        <!-- Transaction management for flows originating from the Delayer -->
        <int:transactional transactionmanager="myAppTransactionManager"/>
    </int:delayer>
</int:chain>
1
Sirisha Karra 22 Июл 2017 в 17:44

1 ответ

Лучший ответ

Это не удивительно. Поскольку вы используете транзакционный ресурс (базу данных), любое исключение в нисходящем потоке вызывает откат транзакции, поэтому данные не удаляются.

Перед выдачей исключения рассмотрите возможность переноса сообщения в отдельный поток. Таким образом транзакция будет зафиксирована.

1
Artem Bilan 22 Июл 2017 в 20:24