我可以在每个CompletableFuture异步调用上放置面向方面的切入点吗?

时间:2018-09-25 04:41:07

标签: java spring aop uid mdc

在我的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中,而不是在每种情况下(如果可能)手动添加以上行

有什么想法吗?

0 个答案:

没有答案