使用Quarkus Hibernate Reactive Panache写库时随机出现Vertx上下文缺失错误
问题分析
随机抛出No current Vertx context found异常的核心原因是:Reactive Messaging的WebSocket消息处理线程有时不在Vert.x Context中执行,而Hibernate Reactive(包括@WithSession/@WithTransaction注解)依赖Vert.x Context来绑定会话和事务上下文,脱离该上下文就会触发这个异常。
解决方案
你可以通过以下两种方式,确保消息处理逻辑始终在Vert.x Context中执行:
方式1:使用@RunOnVertxContext注解
直接给消费者方法添加io.quarkus.vertx.RunOnVertxContext注解,强制方法在Vert.x上下文中运行:
@Inject Mutiny.SessionFactory sf; @RunOnVertxContext @WithSession @Incoming("collector") Uni<Void> collect(final String text) { Mss msg = new Mss(text); return sf.withTransaction(session -> msg.persistAndFlush()).replaceWithVoid(); }
方式2:手动绑定到Vert.x执行器
如果注解方式不生效,可通过Mutiny的runSubscriptionOn方法,将Uni的执行绑定到Vert.x事件循环上下文:
@Inject Vertx vertx; @Inject Mutiny.SessionFactory sf; @WithSession @Incoming("collector") Uni<Void> collect(final String text) { Mss msg = new Mss(text); return sf.withTransaction(session -> msg.persistAndFlush()) .replaceWithVoid() .runSubscriptionOn(vertx.getOrCreateContext().executor()); }
额外注意事项
- 检查
quarkiverse.reactivemessaging.http的配置,避免将WebSocket消费者配置到非Vert.x线程池执行; - 该问题是上下文绑定问题,和Quarkus版本无关,无需切换版本;
- 空逻辑方法也报错,进一步验证了异常是上下文缺失导致,而非数据库操作本身的问题。
内容的提问来源于stack exchange,提问作者alick
相关产品推荐
相关产品推荐

