Как справиться с полной компенсацией с помощью 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.