问题描述
我有一个以flow
开头的poller
,并使用async
将消息传递到下游的几个task-executors
流,以便在parallel
中执行给定的数据集。下游aggregator
完成该流程并通知轮询器flow
已完成。
我希望通过使用track
MDC
轮询的每次执行,以便可以将logs
映射到flow
的特定执行。
我首先在轮询器线程中添加了MDC
(使用Advice
),但是使用这种方法可能会遇到一些问题:
- 发生
MDC
交接时,如何在执行程序线程上标记async
? - 由于执行程序使用
thread pool
,我需要在MDC
返回池之前清除thread
吗?会不会有副作用?
另一种方法是将MDC
添加到Message
标头,并在thread
切换期间在新的async
上手动设置它。 该怎么做?例如,如果我打开debug
日志,则应在新的MDC
执行开始时立即标记thread
,然后而不是从我的逻辑从service activator
开始的那一点开始。
如何使用task-executor
配置在XML
线程上进行设置(并可能在返回池之前删除)?像here一样的MdcAwareThreadPoolExecutor
。
另外,我不希望MDC
逻辑分布在所有async
切换端点上,也许有一些通用的配置方法?
解决方法
我想使用MDC跟踪轮询器的每次执行,以便可以将日志映射到流的特定执行。
听起来完全是“您想跟踪消息流中的消息旅程”。如您所见,有一种方法可以设置一些消息头。因此,为什么不通过此特定标题映射日志?
您可以看一下“消息历史记录”模式,如何收集消息的整个路径,因此在日志中,您可以追溯到消息标题中来回溯它。
如果您确实仍然坚持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