以前一直习惯用 ThreadLocal,但在异步下就不知道怎么搞了,InheritableThreadLocal 的话,没有找到清除用户的入口,filter 肯定不行了,请求结束子线程还没完成不可能去把数据清理掉,求各位大佬指点。 现在的问题是很多代码当初只考虑的是单线程,直接 service 层获取登陆用户,现在要异步的话代码全报错了,当初这种写法是不是不能用
以前一直习惯用 ThreadLocal,但在异步下就不知道怎么搞了,InheritableThreadLocal 的话,没有找到清除用户的入口,filter 肯定不行了,请求结束子线程还没完成不可能去把数据清理掉,求各位大佬指点。 现在的问题是很多代码当初只考虑的是单线程,直接 service 层获取登陆用户,现在要异步的话代码全报错了,当初这种写法是不是不能用
|
1
1.异步线程可以设置上下文,通过上下文传递
2.想办法在子线程前后织入登录用户相关的信息,即 Context 3.阿里的 TTL ( transmittable-thread-local )可以参考 |
|
buzaiyouyu123Apr 9, 2021
2
或者自己来实现一个线程池的 wrapper
|
|
3
自愧不如没有 30,只有 18
|
|
4
不敢当不敢当
18cm 来观赏各位巨巨的优雅 |
|
AruforceApr 9, 2021 via Android
5
无参过去应该不行…
|
|
dqzcwxbApr 9, 2021
10
当成参数传递给异步线程,你用其他的方式也不过是 ThreadLocal 的变种
|
|
12
我这边的方案是获取登录态信息只在 controller 层处理,往下层走的时候以方法参数的形式传过去。
具体的流程是: 1. 网关获取请求头中的 token,登录态 filter 解析 token ( isLogin,uid,uname,merchantId )设置到请求头。 2. 网关带着登录态请求头转发请求。 3. 底层服务从来不需要关注登录态,直接获取请求头即可。 |
|
securityCodingApr 9, 2021
13
@dengji85 本身属于确定性的参数,就应该显示传
|
|
tsanieApr 9, 2021
14
30 怕不是从肛门开始量(
|
|
15
现在问个问题都这么骚了吗
|
|
16
在同步编程模型下直接通过本地线程变量获取绑定的信息,相当于在这个线程上下文中设定了全局变量。
使用同步编程模型,如果在 service 里面获取当前的信息,就跟使用 service 的环境耦合了(本地线程变量),service 不是无状态的。 当然如果一直使用这种同步编程模型是没什么问题的,但如果想要在异步环境下不改变代码也可以使用 service 的话,就必须要在执行阶段先进行类似环境绑定的操作。 比如在执行前,将之前的全局变量绑定到当前的线程,执行完以后再清除避免下一个执行任务获取到错误的信息。 |
|
CatKillerApr 9, 2021
17
无 图 言 弔
|
|
bz5314520Apr 9, 2021
19
请求来的时候,自己包装个上下文呗。
|
|
20
与 12 楼一样,获取登录态信息只在 controller 层处理,往下层走的时候以方法参数的形式传过去
|
|
keshawnvanApr 9, 2021
21
作为参数传过去,Service 层不应该感知登录态的。
|
|
vacuitymApr 9, 2021
22
我们用 dubbo 的时候是放在上下文,然后拦截之后放在 threadlocal
|
|
23
异步线程是如何创建的呢?线程池?
我们项目使用的全局线程池,方案是线程池每次执行的时候都从父线程中把 1 、Shiro/Spring security 当前用户 context 存放在 InheritableThreadLocal 中 2 、 线程池内线程每次执行任务时都将父线程 InheritableThreadLocal 复制给池内子线程 记了个笔记 https://zhaoydo.gitee.io/2020/08/26/thread-pool-thread-local/ |
|
ychostApr 9, 2021
24
Service 层不应该主动感知用户信息,应该是 Controller 层感知到,然后传给 Service 层处理,
|
|
xuanbgApr 9, 2021
25
拦截器或网关验证 token 的时候解析出来用户信息,然后放在请求头上面。Controller 里面取出来传给 Service 。
|
|
26
@yisheyuanzhang InheritableThreadLocal 这种只适合单体架构,局限性比较大
|
|
aguesukaApr 10, 2021 via Android
27
异步怎么实现的?成熟的同步或者异步方案都有 threadlocal 或者 context(vertx)。如果没有就自己实现一个。
|