用于异步流程和任务执行器的Spring Integration MDC

问题描述

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

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

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

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

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

是否有更好的方法来实现这一目标?有任何已知的解决方案吗?

解决方法

我想使用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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...