Ниже приведен код задержки, который я использую в своем приложении. Выходной канал 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 ответ
Это не удивительно. Поскольку вы используете транзакционный ресурс (базу данных), любое исключение в нисходящем потоке вызывает откат транзакции, поэтому данные не удаляются.
Перед выдачей исключения рассмотрите возможность переноса сообщения в отдельный поток. Таким образом транзакция будет зафиксирована.
Похожие вопросы
Новые вопросы
spring
Spring Framework - это среда с открытым исходным кодом для разработки приложений на платформе Java. В ее основе лежит широкая поддержка компонентно-ориентированных архитектур, и в настоящее время в ней имеется более двадцати высокоинтегрированных модулей.