Quarkus反应式消息:Kafka消费者查库触发ContextNotActiveException是否正常?
这属于预期行为
这个异常是完全符合预期的,原因如下:
在Jakarta EE/Quarkus这类CDI环境中,@Incoming标注的消息消费方法默认不会自动激活CDI请求上下文或事务上下文。而JPA的EntityManager(你的repository底层依赖它执行数据库操作)必须在活跃的上下文环境中才能正常工作——要么是事务上下文,要么是请求上下文。
你的消费方法仅标注了@Incoming和@RunOnVirtualThread,没有触发任何上下文的激活,所以调用repository.getById()时,底层EntityManager找不到可用的上下文,就会抛出ContextNotActiveException。
解决办法
有两种常见的修复方式:
- 添加
@Transactional注解:事务上下文会自动激活,即使是只读的SELECT操作也能在事务中正常执行,框架会处理EntityManager的上下文绑定:@Incoming("topic") @RunOnVirtualThread @Transactional void consume(final SomeMessage message) { repository.getById(message.getId()); } - 添加
@ActivateRequestContext注解:如果不需要事务(比如纯只读查询,想避免事务开销),可以激活CDI请求上下文,让EntityManager能正常工作:@Incoming("topic") @RunOnVirtualThread @ActivateRequestContext void consume(final SomeMessage message) { repository.getById(message.getId()); }
内容的提问来源于stack exchange,提问作者akastyka
相关产品推荐
相关产品推荐

