Spring 异步流和任务执行器的集成 MDC

Spring Integration MDC for Async Flow and Task Executors

我有一个以 poller 开头的 flow 并使用 task-executors 将消息传递给下游的几个 async 流以在 parallel 中执行对于给定的数据集。下游 aggregator 完成流程并通知轮询器 flow 已完成。

我想 track 通过使用 MDC 轮询器的每次执行,以便 logs 可以映射到 flow 的特定执行。

我首先将 MDC 添加到轮询器线程(使用 Advice),但是使用这种方法可能会出现几个问题:

  1. 如何在 async 切换发生时在执行程序线程上标记 MDC
  2. 既然executor使用了一个thread pool,我需要在thread returns到池之前清除MDC吗?会不会有副作用?

另一种方法是将 MDC 添加到 Message header 并在 async 切换期间在新的 thread 上手动设置它。 怎么做? 例如,如果我打开 debug 日志,MDC 应该从新 [=28= 的开头开始标记] 执行,而不是从我的逻辑在 service activator 开始的那一点。 如何使用 XML 配置在 task-executor 线程上设置它(并且可能在返回池之前删除)?像 MdcAwareThreadPoolExecutor 看到的东西 here。 另外,我不希望 MDC 逻辑分布在所有 async 切换端点上,可能有一些通用的配置方法吗?

有没有更好的方法来实现这个?任何已知的解决方案?

I would like to track every execution of the poller by using MDC so that the logs can be mapped to a particular execution of the flow.

“您想跟踪流程中的消息旅程”完全正确。正如您所注意到的,有一种方法可以设置一些消息 header。那么,为什么不通过这个特定的 header 映射您的日志?

您可以查看消息历史记录模式,了解如何收集消息的完整路径,然后在日志中您可以通过查看消息 headers 来追踪它。

看这里:https://docs.spring.io/spring-integration/docs/5.3.2.RELEASE/reference/html/system-management.html#message-history

如果你真的仍然坚持使用 MDC,那么你肯定需要看看一些 MDCDelegatingExecutorDecorator. Some sample you can borrow from Spring Security and its DelegatingSecurityContextExecutor`:https://docs.spring.io/spring-security/site/docs/5.4.0/reference/html5/#concurrency