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