Quarkus打包后ConsumeEvent线程与quarkusDev模式不一致问题咨询
问题诱因
该问题属于Quarkus 2.1.x~2.2.x版本的已知构建期缺陷:生产构建阶段的注解处理逻辑会错误忽略@ConsumeEvent注解的blocking = true属性,默认将事件消费方法分配到Quarkus全局默认executor线程池(即你观察到的executor-thread-x线程),不会遵循vertx worker线程池的大小配置;而dev模式采用的是热部署阶段的元数据加载逻辑,不会触发这个构建期处理错误,因此dev模式表现符合预期。
解决方法
方案1:版本升级(推荐)
直接将Quarkus版本升级到2.3.0.Final及以上的稳定版本,该缺陷已经在后续版本被官方修复,升级后dev和prod模式的线程执行逻辑会保持一致,@ConsumeEvent(blocking = true)的方法会正常在vertx worker线程池执行,遵循quarkus.vertx.worker-pool-size配置限制。
方案2:临时兼容(无法升级版本时使用)
如果当前业务不允许直接升级Quarkus版本,可任选以下一种兼容方案:
- 在标注了
@ConsumeEvent(blocking = true)的方法上,额外添加@io.smallrye.common.annotation.Blocking注解,显式声明该方法为阻塞方法,该注解的处理优先级更高,不会被构建期逻辑忽略,会强制将方法调度到vertx worker线程池执行。 - 在项目配置文件中添加显式配置,强制指定对应事件地址的消费逻辑为阻塞模式,配置格式为
quarkus.vertx.event-bus.consumers.<你的事件地址>.blocking=true,可直接覆盖注解处理的错误逻辑。
验证方式
修改完成后执行构建命令,用java -jar运行构建产物,打印消费方法的当前线程名称,确认线程名前缀为vert.x-worker-thread,同时提交批量任务验证并发数是否符合你配置的worker池大小即可。
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

