Spring Boot 使用WebAsyncTask异步返回结果

 更新时间:2018年02月02日 15:39:37   作者:尹吉欢  
这篇文章主要介绍了Spring Boot 使用WebAsyncTask异步返回结果的相关资料,需要的朋友可以参考下

在Spring Boot中(Spring MVC)下请求默认都是同步的,一个请求过去到结束都是由一个线程负责的,很多时候为了能够提高吞吐量,需要将一些操作异步化,除了一些耗时的业务逻辑可以异步化,我们的查询接口也是可以做到异步执行。

一个请求到服务上,是用的web容器的线程接收的,比如线程http-nio-8084-exec-1

我们可以使用WebAsyncTask将这个请求分发给一个新的线程去执行,http-nio-8084-exec-1可以去接收其他请求的处理。一旦WebAsyncTask返回数据有了,就会被再次调用并且处理,以异步产生的方式,向请求端返回值。

示例代码如下:

@RequestMapping(value="/login", method = RequestMethod.GET)
public WebAsyncTask<ModelAndView> longTimeTask(){
  System.out.println("/login被调用 thread id is : " + Thread.currentThread().getName());
  Callable<ModelAndView> callable = new Callable<ModelAndView>() {
      public ModelAndView call() throws Exception {
        Thread.sleep(1000); /模拟长时间任务
        ModelAndView mav = new ModelAndView("login/index");
        System.out.println("执行成功 thread id is : " + Thread.currentThread().getName());
        return mav;
      }
  };
  return new WebAsyncTask<ModelAndView>(callable);
}

可以看到输出结果如下:

/login被调用 thread id is : http-nio-8084-exec-1

执行成功 thread id is : MvcAsync1

在执行业务逻辑之前的线程和具体处理业务逻辑的线程不是同一个,达到了我们的目的。

然后我做了一个并发测试,发现不停的在创建MvcAsync1这个线程,我就在想,难道没有用线程池?

通过阅读源码才发现果真如此,WebAsyncManager是Spring MVC管理async processing的中心类。

默认是使用SimpleAsyncTaskExecutor,这个会为每次请求创建一个新的线程

private AsyncTaskExecutor taskExecutor = new SimpleAsyncTaskExecutor(this.getClass().getSimpleName());

如果说任务指定了executor,就用任务指定的,没有就用默认的SimpleAsyncTaskExecutor

AsyncTaskExecutor executor = webAsyncTask.getExecutor();
if (executor != null) {
  this.taskExecutor = executor;
}

我们可以配置async 的线程池,不需要为每个任务单独指定

通过configurer.setTaskExecutor(threadPoolTaskExecutor());来指定

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.web.context.request.async.TimeoutCallableProcessingInterceptor;
import org.springframework.web.servlet.config.annotation.AsyncSupportConfigurer;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {
  @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("YJH");
    return t;
  }
}

配置完之后就可以看到输出的线程名称是YJH开头的了,而且也不会一直创建新的线程

可以看到输出结果如下:

/login被调用 thread id is : http-nio-8084-exec-1
执行成功 thread id is : YJH1

总结

以上所述是小编给大家介绍的Spring Boot 使用WebAsyncTask异步返回结果,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • Spring Security权限注解启动及逻辑处理使用示例

    Spring Security权限注解启动及逻辑处理使用示例

    这篇文章主要为大家介绍了Spring Security权限注解启动及逻辑处理使用示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • Java static关键字详细介绍与用法总结

    Java static关键字详细介绍与用法总结

    这篇文章主要介绍了Java中static关键字的作用和用法详细介绍,主要讲了静态方法、静态变量、静态类、static和final一块用等内容。需要的朋友可以参考下
    2017-04-04
  • spring security自定义登录页面

    spring security自定义登录页面

    在项目中我们肯定不能使用Spring自己生成的登录页面,而要用我们自己的登录页面,下面通过本文给大家分享spring security自定义登录页面的实现方法,一起看看吧
    2017-09-09
  • 在jmeter的beanshell中用java获取系统当前时间的简单实例

    在jmeter的beanshell中用java获取系统当前时间的简单实例

    这篇文章介绍了在jmeter的beanshell中用java获取系统当前时间的简单实例,有需要的朋友可以参考一下
    2013-09-09
  • 详解JavaFX桌面应用开发-Group(容器组)

    详解JavaFX桌面应用开发-Group(容器组)

    这篇文章主要介绍了JavaFX桌面应用开发-Group(容器组),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • 详解Spring-boot中读取config配置文件的两种方式

    详解Spring-boot中读取config配置文件的两种方式

    这篇文章主要介绍了详解Spring-boot中读取config配置文件的两种方式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • mybatis-plus自动填充插入更新时间有8小时时差

    mybatis-plus自动填充插入更新时间有8小时时差

    本文主要介绍了mybatis-plus自动填充插入更新时间有8小时时差,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • java转换字符串编码格式的方法

    java转换字符串编码格式的方法

    这篇文章主要介绍了java转换字符串编码格式的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08
  • JavaCV简介与环境搭建详细步骤

    JavaCV简介与环境搭建详细步骤

    JavaCV是一个开源的Java接口,它为几个著名的计算机视觉库(如OpenCV、FFmpeg)提供了Java封装,这篇文章主要给大家介绍了关于JavaCV简介与环境搭建的相关资料,需要的朋友可以参考下
    2024-04-04
  • 教你使用eclipse 搭建Swt 环境的全过程

    教你使用eclipse 搭建Swt 环境的全过程

    本文给大家分享使用eclipse 搭建Swt 环境的全过程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-12-12

最新评论