各位 30cm, 问一下 所谓的 service 层中怎么优雅获取当前用户

2021-04-09 14:42:02 +08:00
 dengji85

以前一直习惯用 ThreadLocal,但在异步下就不知道怎么搞了,InheritableThreadLocal 的话,没有找到清除用户的入口,filter 肯定不行了,请求结束子线程还没完成不可能去把数据清理掉,求各位大佬指点。 现在的问题是很多代码当初只考虑的是单线程,直接 service 层获取登陆用户,现在要异步的话代码全报错了,当初这种写法是不是不能用

4335 次点击
所在节点    Java
29 条回复
keshawnvan
2021-04-09 17:30:46 +08:00
作为参数传过去,Service 层不应该感知登录态的。
vacuitym
2021-04-09 17:34:14 +08:00
我们用 dubbo 的时候是放在上下文,然后拦截之后放在 threadlocal
yisheyuanzhang
2021-04-09 17:38:41 +08:00
异步线程是如何创建的呢?线程池?
我们项目使用的全局线程池,方案是线程池每次执行的时候都从父线程中把
1 、Shiro/Spring security 当前用户 context 存放在 InheritableThreadLocal 中
2 、 线程池内线程每次执行任务时都将父线程 InheritableThreadLocal 复制给池内子线程
记了个笔记 https://zhaoydo.gitee.io/2020/08/26/thread-pool-thread-local/
ychost
2021-04-09 17:45:18 +08:00
Service 层不应该主动感知用户信息,应该是 Controller 层感知到,然后传给 Service 层处理,
xuanbg
2021-04-09 22:06:55 +08:00
拦截器或网关验证 token 的时候解析出来用户信息,然后放在请求头上面。Controller 里面取出来传给 Service 。
xuanbg
2021-04-09 22:09:54 +08:00
@yisheyuanzhang InheritableThreadLocal 这种只适合单体架构,局限性比较大
aguesuka
2021-04-10 11:50:23 +08:00
异步怎么实现的?成熟的同步或者异步方案都有 threadlocal 或者 context(vertx)。如果没有就自己实现一个。
RuzZ
2021-04-14 17:27:27 +08:00
> InheritableThreadLocal 这种只适合单体架构,局限性比较大
@xuanbg 没理解为什么说 InheritableThreadLocal 只适合单体架构,我的理解 InheritableThreadLocal 本质上就是创建线程时,会将父类的`inheritableThreadLocals`复制到子类的`inheritableThreadLocals`中,一个父子级线程可以传递的 threadLocal
xuanbg
2021-04-14 21:57:08 +08:00
@RuzZ 不同机器还能传递?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/769430

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX