多线程编程ThreadLocal数据传递问题
现象
线上bug,预约状态展示问题,用户点击预约后再次刷新又展示预约按钮。
原因
由于处于首页,接口访问服务器后请求各种数据是以多线程的形式执行,获取用户预约状态需要根据用户accountId去查库,accountId由底层方法实现在Request请求对象的Header中,而子线程无请求的attributes数据,故获取预约状态失败。
解决办法
开启异步线程时将父线程ThreadLocal中的数据传递至子线程
// 获取父线程ThreadLocal的数据,传递至子线程中
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
CompletableFuture future = CompletableFuture.runAsync(() -> {
RequestContextHolder.setRequestAttributes(attributes);
// 子线程要处理的业务代码
······
});