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

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

  •  
  •   shayang888 · 2018-11-17 23:03:34 +08:00 · 3167 次点击
    这是一个创建于 1958 天前的主题,其中的信息可能已经有所发展或是发生改变。

    比如 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
    johnniang
        1
    johnniang  
       2018-11-17 23:23:28 +08:00 via Android
    是否因为由于异步导致再次回调造成的呢
    shayang888
        2
    shayang888  
    OP
       2018-11-17 23:33:17 +08:00
    @johnniang 请问你有遇到过吗
    johnniang
        3
    johnniang  
       2018-11-17 23:46:32 +08:00 via Android
    @shayang888 没有关注过这个 handler 的执行次数。不过建议你打断点调试一下,弄清楚异步请求的原理
    mmdsun
        4
    mmdsun  
       2018-11-18 01:29:33 +08:00 via Android
    我记得拦截异步需要用异步拦截器。spring 有异步拦截器的
    sutra
        5
    sutra  
       2018-11-18 13:06:44 +08:00
    session 管理机制可能用到了 ThreadLocal。
    shayang888
        6
    shayang888  
    OP
       2018-11-18 13:17:53 +08:00
    @mmdsun 我用了异步拦截器也是一样 会输出 2 次 我在网上倒是搜到个答案就是判断请求的 dispatchServeletName == REQUEST
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1814 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 16:30 · PVG 00:30 · LAX 09:30 · JFK 12:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.