在我的spring-boot java项目中,我有数百个API,它们会在不同情况下调用其他后端API。这些调用发生在并行线程中(在CompletableFuture异步方法内部)。为了进行记录,我需要为单个会话记录具有唯一ID的每个呼叫,以识别哪个会话发起了哪个后端调用。请注意,多个会话也并行运行。 (这里不是我关注的日志记录机制。)
假设:一个用户使用我的模块请求了一些数据。这是我的API中的“会话”。我的模块现在将自动为此会话分配一个唯一的ID(我们将其称为“ UID”)。现在,假设在CompletableFuture并行线程中执行了15个不同的请求,以从后端服务器检索此用户请求的数据。我需要为这些调用中的每个调用创建日志,这些日志中将包含此UID。
为使此UID可全局用于日志记录机制,在会话开始时(Spring API控制器层),我使用了MDC(映射的诊断上下文),并使用
MDC.put(“ uid”,uid);
现在,每当在某个类中发生异步调用时,我都需要像上面一样将此值放在MDC中,以使其在新线程中可用,如下所示:
String uid = MDC.get("uid")
CompletableFuture.supplyAsync({
MDC.put("uid", uid)
... //some api related tasks
虽然这种方法有效,但也很麻烦,因为我需要在每个异步调用中手动添加此行。这导致时间浪费,编辑代码复杂,使将来的更改变得麻烦,而且我还需要付出很多努力。
因此,我需要在面向方面的编程中设置类似切入点的功能,在该方法中,我将定义此切入点以在任何CompletableFuture异步方法调用之后将值放入MDC中,而不是在每种情况下(如果可能)手动添加以上行
有什么想法吗?