Код: Выделить всё
doSelect1
Код: Выделить всё
doUpdate1
[*] немедленный ответ: После успешного завершения doselect1 и doupdate1 , API должен немедленно вернуть результат Doselect1 к клиенту. Обновление базы данных (
Код: Выделить всё
doUpdate2
Вот моя текущая реализация с использованием uni.combine () :
import io.smallrye.mutiny.Uni;
import io.smallrye.mutiny.tuples.Tuple3;
import io.quarkus.hibernate.reactive.panache.common.WithTransaction;
import jakarta.transaction.Transactional;
// ...
@WithTransaction
public Uni doLogin() {
// I want doSelect1() and doUpdate1() to succeed together,
// and for the method to return as soon as they are done.
// doUpdate2() should run in the background without blocking the response.
return Uni.combine().all().unis(doSelect1(), doUpdate1(), doUpdate2().onFailure().recoverWithNull())
.asTuple()
.onItem().transform(tuple -> tuple.getItem1()); // Return the result of doSelect1
}
public Uni doSelect1() {
// ... database query logic
}
public Uni doUpdate1() {
// ... database update logic
}
// This should be a non-blocking, "fire-and-forget" operation
// in a new transaction.
@WithTransaction
@Transactional(Transactional.TxType.REQUIRES_NEW) // Start a new transaction
public Uni doUpdate2() {
// ... another database update logic that might fail
// and should not affect the main flow.
}
Проблема:
Мой текущий код почти работает. OnFailure (). Recoverwithnull () на doupdate2 () правильно предотвращает его сбой, чтобы весь трубопровод не сработал. Тем не менее, uni.combine (). All () часть все еще ждет всех трех Uni s, прежде чем продолжить. Это означает, что ответ API заблокирован до тех пор, пока не Doupdate2 , который нарушает мое требование «огне-самого и жесткого».
Мой вопрос:
Как я могу правильно реализовать это не блокирующее поведение и код/код> и код. Вместе в транзакции? Это рекомендуемый подход здесь, или есть более простой способ достичь этого, используя только мятеж? Например, есть ли способ подписаться на DoupDate2 , не имея его в рамках операции Blocking Combine ? Спасибо!
Подробнее здесь: https://stackoverflow.com/questions/797 ... ide-a-main