在Quarkus/Kogito Serverless Workflow中设置MDC的方案咨询
Kogito Workflow响应式环境下MDC属性管理方案
1. 确保MDC在响应式环境中正确传递
首先在application.properties中开启Quarkus Vert.x的MDC适配,让MDC绑定到Vert.x上下文,线程切换时自动传递上下文信息:
quarkus.vertx.mdc=true
2. 优化SubscriberDecorator的txid处理
优先从消息元数据中获取上游传递的txid,无则生成唯一ID,避免同一上下文内重复生成:
@ApplicationScoped public class ConsumedMessageDecorator implements SubscriberDecorator { @Override public int getPriority() { return 10; } @Override public Multi<? extends Message<?>> decorate(Multi<? extends Message<?>> toBeSubscribed, List<String> channelNames, boolean isConnector) { return toBeSubscribed.onItem().invoke(message -> { // 从消息元数据提取txid,无则生成 String txid = message.getMetadata("txid", String.class) .orElseGet(() -> UUID.randomUUID().toString()); if (MDC.get("txid") == null) { MDC.put("txid", txid); } }); } }
3. 正确的MDC清理时机
由于同一工作流上下文会执行多步骤并自推消息,禁止在单个消息处理后立即清理MDC,否则后续步骤会丢失txid。推荐两种精准清理方式:
方式一:利用请求上下文生命周期
创建RequestScoped Bean,借助容器的生命周期钩子在请求/上下文结束时自动清理MDC:
@RequestScoped public class MdcCleanupBean { @PreDestroy void cleanupMdc() { MDC.clear(); } }
在ConsumedMessageDecorator中注入该Bean即可,容器会自动管理其生命周期,无需手动调用:
@ApplicationScoped public class ConsumedMessageDecorator implements SubscriberDecorator { @Inject MdcCleanupBean mdcCleanupBean; // 原有装饰逻辑... }
方式二:监听工作流实例生命周期
通过Kogito的流程事件监听器,在工作流实例完成或终止时清理MDC,精准绑定工作流生命周期:
@ApplicationScoped public class WorkflowInstanceListener implements ProcessEventListener { @Override public void afterProcessCompleted(ProcessCompletedEvent event) { MDC.remove("txid"); } @Override public void afterProcessAborted(ProcessAbortedEvent event) { MDC.remove("txid"); } }
4. 关键注意事项
- 异步分支场景下,开启
quarkus.vertx.mdc=true后,Quarkus会自动在Vert.x上下文间传递MDC信息,无需额外处理。 - 避免在工作流步骤中手动修改或清理MDC,保持统一的入口(SubscriberDecorator)和出口(生命周期钩子)管理,防止上下文混乱。
内容的提问来源于stack exchange,提问作者josesuero
相关产品推荐
相关产品推荐

