Как справиться с полной компенсацией с помощью Mutiny?

Работая над Quarkus и SmallRye Mutiny, я не знаю, как поступать с компенсациями.

У меня есть список сотрудников, и я должен обновить их всех в базе данных. Объект доступа к данным (EmployeeDao) имеет следующий метод: public Uni<Boolean> update(Long id, String name, Long deptId). Ожидается получение полей сотрудника.

Кроме того, я должен вернуть Uni<Boolean>чтобы уведомить, все ли обновления прошли нормально или нет. Что-то вроде приведенного ниже:

public Uni<Boolean> updateEmployees(List<Employee> employees) {
    for(Employee employee: employees) {
        //TODO: Execute or compensate
    }
}

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

В случае сбоя в процессе обновления любого сотрудника я хотел бы попробовать несколько раз, а после этого, если я не смог обновить сотрудника, я должен отменить всех сотрудников, прежде чем возвращать какой-либо ответ. Идея состоит в том, чтобы поддерживать базу данных в согласованном состоянии.

Как справиться с полной компенсацией с помощью Mutiny?

1 ответ

Решение

Если я правильно понял, вы хотите выполнить набор асинхронных операций и объединить их. Для этого вы можете сделать что-то вроде:

List<Uni<?>> list = new ArrayList();
for(Employee employee: employees) {
   Uni<Void> uni = update(employee);
   list.add(uni);
}

return Uni.combine().all().unis(list)
   .with(list -> { /* all employees have been updated */ return true; })
   .onFailure().call(failure -> {
       Uni<?> uni = compensate();
       return uni.onItem().transform(x -> false);
   });

Первый взгляд собирает Unis для каждого обновления. Затем мы их объединяем. Если все в порядке, мы в порядке и вернем истину. Если происходит что-то плохое, мы компенсируем и возвращаем false.

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