Scala, ZIO — повторите попытку, если данные не вставлены в базу данных cassandra

У меня есть простой метод, который добавляет данные в базу данных Cassandra:

 def addData(data: SomeData): Task[Either[Exception, Unit]]

Я использую его для добавления одних и тех же данных в две таблицы одного типа:

for {
 persistOneTable <- repo.addData(data).mapError(SomeError(_))
 persistSecondTable <- repo2.addData(data).mapError(SomeError(_))
} yield ()

Мой вопрос: как мне изменить этот код, чтобы повторить попытку вставки в таблицу, если она не удалась в первый раз? Я не хочу иметь несогласованные данные в таблицах, поэтому, если это не удалось после вставки в первую таблицу, я хочу повторить попытку, а затем вставить во вторую таблицу, а также повторить попытку, пока она не будет добавлена, чтобы иметь точно такие же данные в обеих таблицах


person Developus    schedule 13.05.2021    source источник
comment
Вы хотите повторить попытку только в случае сбоя Task? Или Exception в Either также указывает на необходимость повторной попытки?   -  person paulpdaniels    schedule 14.05.2021
comment
Только если Task не удалось.   -  person Developus    schedule 14.05.2021


Ответы (1)


Вы можете вызвать retry по результатам и передать политику повторных попыток.

Например, addData(data).retry(policy = Schedule.recurs(5)).
Вы можете комбинировать планировщики с операторами && (и) или || (или).

Существуют также специальные методы повтора для таких эффектов, как retryN(n: Int).
Возможно, один из них подойдет вам.

person Nabil A.    schedule 17.05.2021