Spring @Retryable с сохраняющим состояние объектом Hibernate - PullRequest
0 голосов
/ 06 февраля 2019

Я пытаюсь заставить свой метод обслуживания повторить попытку при сбое с помощью Springs @ Retryable.

@Retryable(backoff = @Backoff(delay = 1000), maxAttempts = 3)
@Transactional(rollbackFor = Throwable.class)
public Something saveSomething(Something something) {
  //some logic and saving
}

Проблема в том, что исключение появляется после сохранения объекта-объекта.Таким образом, транзакция откатывается и метод вызывается снова.Разница в том, что id объекта-объекта больше не является нулевым, а значением, которое он получил от предыдущего процесса сохранения в Hibernate, поэтому во второй попытке Hibernate не сохраняет объект, а пытается его обновить.Поскольку в БД нет записей, обновление ничего не делает, и объект не сохраняется в БД.

После распознавания этого я попытался установить для свойства @ful для свойства stateful значение true:

@Retryable(backoff = @Backoff(delay = 1000), maxAttempts = 3, stateful = true)
@Transactional(rollbackFor = Throwable.class)
public Something saveSomething(Something something) {
  //some logic and saving
}

Но с этой конфигурацией saveSomething () просто вызывается один раз, а der - не вторая попытка.

Кто-нибудь предлагал решить эту проблему?

1 Ответ

0 голосов
/ 06 февраля 2019

при использовании повторения с сохранением состояния;вызывающий должен снова вызвать метод для следующей попытки;государство утверждает, сколько попыток было сделано.Таким образом, вы должны использовать try / catch и вызывать saveSomething в цикле (с новым Something или установкой идентификатора в null) до тех пор, пока это не удастся - используя метод @Recover для случаев, когда повторные попытки исчерпаны, где выможет выдать другое исключение, чтобы вызывающая сторона знала разницу между чем-то, что следует повторить, и когда попытки исчерпаны.

...