request param入参丢失

现象

接收request请求,第一次获取到了param,第二次获取不到

原因

第一次接受到request之后,把request存储在

TransmittableThreadLocal<HttpServletRequest> REQUEST_THREAD_LOCAL = new TransmittableThreadLocal<>()

当中以便给异步线程使用,由于controller线程exe1已经执行完成了,但是controller创建的子线程还没有执行完但是占用着request,导致request中有个属性状态值没有改变,后面新的请求又使用了同个线程exe1,导致request不会赋值新的param

解决方案

controller起子线程使用如下方式,使用完关闭线程池

        ServletRequestAttributes attributes = (ServletRequestAttributes)       
        RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        RequestUtil.shareRequest(request);
        ExecutorService executorService = ThreadUtil.newExecutor(10 ,10);
        // 如果没有使用Ttl线程来处理,会有线程安全问题,并发量大会出现获取不到数据的情况
        ExecutorService ttlExecutorService = TtlExecutors.getTtlExecutorService(executorService);
        try {
            CompletableFuture<String> completableFuture = CompletableFuture.supplyAsync(() -> {
                try {
                    Thread.sleep(10000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                String token = userInfoManager.getToken();
                if (token == null) {
                    logger.info("test1 token is null");
                }
                return "yes";
            }, ttlExecutorService);
            CompletableFuture.allOf(new CompletableFuture[]{completableFuture}).join();
            String result = null;
            try {
                result = completableFuture.get();
                logger.info("result:{}", result);
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        } finally {
            RequestUtil.removeShareRequest();
            ttlExecutorService.shutdown();
        }
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容