我当前项目是一个多租户的项目,今天测试某个功能时发现有问题,这个功能是提供一个期末成绩模板,为学生生成一个期末成绩word文档并转换为pdf格式,为了追求省时,我采用了自定义线程池来完成。但是以往测试是在管理员账户默认的租户下测试的,导致一直没发现这个问题,这次换了一个租户进行测试,就出现了在使用多线程之前的sql查询附带的租户id是正确的,但是多线程程序里面的sql查询附带的租户id却是默认的管理员租户id,导致数据一直没查出来,后来我查找了系统代码,发现租户是附带在Request请求中的,当请求中没有时则为默认租户id,找到了原因,我就开始上网查询,发现线程池之间是不共享上下文信息的,所以主线程的Request请求并没有传给线程池,导致线程池取不到租户id。
解决方法如下:
获取请求,然后在线程池执行时在里面设置RequestAttributes达到在线程之间传递上下文请求信息