首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  Java

为什么 springmvc 在 controller 层使用异步方法的时候,很多地方都会有奇怪的影响?

  •  
  •   shayang888 · 93 天前 · 1279 次点击
    这是一个创建于 93 天前的主题,其中的信息可能已经有所发展或是发生改变。

    比如 controller 是这样的

    @RestController
    public class TestController{
    	@GetMapping(value="/test")
        public CompletableFuture<Object> testController(){
        	.....
            return CompletableFuture.completedFuture(service())
        }
    

    1.这种情况,当使用拦截器 preHandle 那里会执行 2 次输出结果

    public Callable<Object> getTokenService(HttpSession httpSession) {
        Map<String, Object> map = new HashMap<>(8);
        String token = UUID.randomUUID().toString();
        httpSession.setAttribute("token", token);
        map.put("data", httpSession.getAttribute("token"));
        return () -> map;
    }
    public Callable<Object> getTokenController(HttpSession httpSession){
    	return () -> service.getTokenService();
    }
    

    2.这种情况,用 redis 管理的 session,会发现就是只会在每次启动 server 后,第一次执行此方法时,token 会插入,当我再次请求这个方法时,session 里 token 的值始终是第一次的值

    有大佬知道为什么吗?

    6 回复  |  直到 2018-11-18 13:17:53 +08:00
        1
    johnniang   93 天前 via Android
    是否因为由于异步导致再次回调造成的呢
        2
    shayang888   93 天前
    @johnniang 请问你有遇到过吗
        3
    johnniang   93 天前 via Android
    @shayang888 没有关注过这个 handler 的执行次数。不过建议你打断点调试一下,弄清楚异步请求的原理
        4
    mmdsun   93 天前 via Android
    我记得拦截异步需要用异步拦截器。spring 有异步拦截器的
        5
    sutra   93 天前
    session 管理机制可能用到了 ThreadLocal。
        6
    shayang888   93 天前
    @mmdsun 我用了异步拦截器也是一样 会输出 2 次 我在网上倒是搜到个答案就是判断请求的 dispatchServeletName == REQUEST
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3888 人在线   最高记录 4385   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 17ms · UTC 07:31 · PVG 15:31 · LAX 23:31 · JFK 02:31
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1