WebAsyncTask直接释放处理线程连接,提高服务器吞吐量

本文深入探讨了Spring框架中异步任务的实现机制,重点介绍了处理线程与异步线程的概念,以及如何通过WebAsyncUtils工具类和WebMvcConfig配置进行异步任务的管理和执行。同时,详细讲解了异步任务的超时处理、错误处理和完成通知等关键环节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

两个基本概念:

  1. 处理线程:处理线程 属于 web 服务器线程,负责 处理用户请求,采用 线程池 管理。

  2. 异步线程:异步线程 属于 用户自定义的线程,可采用 线程池管理

工具类:

public class WebAsyncUtils {
    Logger logger = LoggerFactory.getLogger(WebAsyncUtils.class);

    /**
     * 移除初始化
     * @param callable
     * @return
     */
    public WebAsyncTask<JsonResponse> instance(Callable callable) {
        WebAsyncTask<JsonResponse> asyncTask = new WebAsyncTask<>(Constants.OUT_TIME, callable);

        asyncTask.onCompletion(() -> logger.info("任务执行完成"));
        asyncTask.onError(() -> {
            return new JsonResponse(JsonResponse.CODE_FAILURE, "out_line");
        });
        asyncTask.onTimeout(() -> {
            return new JsonResponse(JsonResponse.CODE_FAILURE, "out_time_line");
        });

        return asyncTask;
    }
}

配置:

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

	@Resource private CurrentUserMethodArgumentResolver currentUserMethodArgumentResolver;

//    WebMvcRegistrationsAdapter a1 = new WebMvcRegistrationsAdapter();

    @Bean
    public HttpMessageConverter<String> responseBodyConverter(){
        StringHttpMessageConverter converter = new StringHttpMessageConverter(Charset.forName("UTF-8"));
        return converter;
    }

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
//        FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
//        //自定义配置...
//        FastJsonConfig config = new FastJsonConfig();
//        /**
//         * QuoteFieldNames———-输出key时是否使用双引号,默认为true
//         WriteMapNullValue——–是否输出值为null的字段,默认为false
//         WriteNullNumberAsZero—-数值字段如果为null,输出为0,而非null
//         WriteNullListAsEmpty—–List字段如果为null,输出为[],而非null
//         WriteNullStringAsEmpty—字符类型字段如果为null,输出为”“,而非null
//         WriteNullBooleanAsFalse–Boolean字段如果为null,输出为false,而非null
//         */
//        config.setCharset(Charset.forName("UTF-8"));
//        config.setSerializerFeatures(SerializerFeature.PrettyFormat);
////        config.setSerializerFeatures(SerializerFeature.WriteMapNullValue);
//        converter.setFastJsonConfig(config);

        converters.add(responseBodyConverter());
    }

    // springboot 方式注入
//    通过 WebMvcRegistrations 来注入 RequestMappingHandlerMapping
    @Configuration
    public class WebMvcRegistrationsConfig implements WebMvcRegistrations {
        @Override
        public RequestMappingHandlerMapping getRequestMappingHandlerMapping() {
            return new MyRequestMappingHandlerMapping();
        }
    }


    @Override
    public void configureAsyncSupport(final AsyncSupportConfigurer configurer) {
        configurer.setDefaultTimeout(60 * 1000L);
        configurer.registerCallableInterceptors(timeoutInterceptor());
        configurer.setTaskExecutor(threadPoolTaskExecutor());
    }

    @Bean
    public TimeoutCallableProcessingInterceptor timeoutInterceptor() {
        return new TimeoutCallableProcessingInterceptor();
    }

    @Bean
    public ThreadPoolTaskExecutor threadPoolTaskExecutor() {
        ThreadPoolTaskExecutor t = new ThreadPoolTaskExecutor();
        t.setCorePoolSize(10);
        t.setMaxPoolSize(50);
        t.setThreadNamePrefix("MISSION");
        return t;
    }
}

使用:

    @CrossOrigin
    @RequestMapping(value = "missions")
    public WebAsyncTask<JsonResponse> getMyMissionList(Integer fid,Integer classId, Integer uid,int page,int pageSize) {
        WebAsyncTask<JsonResponse> asyncTask = new WebAsyncUtils().instance(()-> {
            try {
                List<Map> list = missionService.getMyMissionList(fid, classId, uid, page, pageSize);
                return new JsonResponse(JsonResponse.CODE_SUCCESS, "success").put("list", list)
                        .put("prefix", env.getProperty("STATIC.RESOURCE.URL") + env.getProperty("STATIC.RESOURCE.PIC.COVER"));
            } catch (Exception e) {
                e.printStackTrace();
                return new JsonResponse(JsonResponse.CODE_FAILURE, e.getMessage());
            }
        });
        return asyncTask;
    }

详解Spring/Spring boot异步任务编程WebAsyncTask

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值