如何在 Panache 的叛变管道中回滚后返回失败



目前正在学习叛变和休眠反应式事务。我需要将Mess对象保存在数据库中,如果有特定条件,我想回滚发送某种失败消息的事务作为保存方法的返回参数。

我怎么能产生失败或异常。在这种情况下,最佳实践是什么.
您能否给我看一个使用此代码片段的示例。

public Uni<Mess> save(Mess mess) {
return Panache.withTransaction(() -> {
if(mess.message.equals("Hello World")){
Panache.currentTransaction().invoke(Transaction::markForRollback).subscribe().with(item -> Log.info("Transaction is marked for roll-back"));
}
return persist(mess);
});
}

这取决于您是否认为这是一个例外。

您可以使用Uni.createFrom().failed(...)创建失败的 uni。 因此,重写示例的一种方法是:

public Uni<Mess> save(Mess mess) {
return Panache.withTransaction(() -> {
if (mess.message.equals("Hello World")) {
return Panache.currentTransaction()
.invoke(Mutiny.Transaction::markForRollback)
.invoke(() -> Log.info("Transaction is marked for roll-back"))
.chain(() -> Uni.createFrom().failure(new RuntimeException()));
}
return persist(mess);
}
}

如果您不认为这是失败,则可以使用Uni.createFrom().nullItem()Uni.createFrom().item(...).

要记住的一件事是,如果会话在使用时发生异常,则应丢弃该会话。帕纳奇不处理这种情况。 有一个关于这个问题的问题,并且有一些解决方法的讨论。但是,简而言之,一种解决方法是直接使用Hibernate反应式:

@Inject
Mutiny.SessionFactory factory;
public Uni<Void> create(Person person){
return factory.withTransaction( (session, tx) ->  {
// Now you have a new session and transaction and you can control them any way you want 
});
}

相关内容

  • 没有找到相关文章

最新更新