【问题标题】:Spring Integration MDC for Async Flow and Task Executors用于异步流和任务执行器的 Spring Integration MDC
【发布时间】:2020-09-25 07:53:43
【问题描述】:

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

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

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

  1. async 切换发生时,如何在执行程序线程上标记MDC
  2. 由于执行器使用thread pool,我是否需要在thread返回池之前清除MDC?会有副作用吗?

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

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

【问题讨论】:

    标签: spring-integration mdc


    【解决方案1】:

    我想使用 MDC 跟踪轮询器的每次执行,以便将日志映射到流的特定执行。

    这完全符合“您想跟踪流程中的消息旅程”的意思。正如您所注意到的,有一种方法可以设置一些消息头。那么,为什么不按此特定标头映射您的日志呢?

    您可以查看消息历史记录模式如何收集消息的整个路径,然后在日志中您可以跟踪它查看消息头。

    请看这里: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

    【讨论】:

      猜你喜欢
      • 2015-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多