异步子线程获取request

开发中,根据实际的业务场景,有些业务非主要业务,而且这些业务可能还比较耗时,比如日子或者消息,这时就需要将业务改为异步执行。比如,

CompletableFuture.runAsync(()->{
	kafkaTemplate.send("operate_log", JSON.toJSONString(operateLog));
});

但是,这是异步执行的业务中可能也需要用到request中的参数,比如,通过

User user = (User) RequestContextHolder.getRequestAttributes().getAttribute("user", 1);

获取当前用户信息(注:user是通过编写了切面,将登陆用户拦截,然后根据用户的token获取到当前用户然后保存到session中,代码:

RequestContextHolder.getRequestAttributes().setAttribute("user", user, 1);

此时,获取到的

RequestContextHolder.getRequestAttributes()为null;即子线程中并获取不到request中的参数。
解决方法:

开启新线程之前,添加代码:
//将RequestAttributes对象设置为子线程共享

ServletRequestAttributes att = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
RequestContextHolder.setRequestAttributes(att, true);
上一篇:Django中的CBV视图


下一篇:Java: 在子线程或者异步情况下使用RequestContextHolder.getRequestAttributes()的注意事项