我们常用ThreadPoolExecutor提供的线程池服务,springboot框架提供了@Async注解,帮助我们更方便的将业务逻辑提交到线程池中异步执行,今天我们就来实战体验这个线程池服务,
-
<李> windowns10;李>
<李> jdk1.8;李>
<李> springboot 1.5.9.RELEASE;李>
<李>开发工具:IntelliJ IDEA;李>
本次实战的源码可以在我的GitHub下载,地址:git@github.com: zq2599/blog_demos.git项目主页:
这里面有多个工程,本次用到的工程为threadpooldemoserver
实战步骤梳理
本次实战的步骤如下:
-
<李>创建springboot工程;李>
<李>创建服务层的接口和实现,李>
<李>创建控制器,开发一个http服务接口,里面会调用服务层的服务,李>
<李>创建线程池的配置;李>
<李>将服务层的服务异步化,这样每次调用都会都被提交到线程池异步执行;李>
<李>扩展ThreadPoolTaskExecutor,在提交任务到线程池的时候可以观察到当前线程池的情况,李>
用IntelliJ IDEA创建一个springboot的web工程threadpooldemoserver, pom.xml内容如下:
& lt; & # 63; xml version=" 1.0 " encoding=" utf - 8 " & # 63;比; & lt;项目xmlns=" http://maven.apache.org/POM/4.0.0 " xmlns: xsi=" http://www.w3.org/2001/XMLSchema-instance " xsi: schemaLocation=" http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd”比; & lt; modelVersion> 4.0.0 & lt; groupId> com.bolingcavalry & lt; artifactId> threadpooldemoserver & lt; version> 0.0.1-SNAPSHOT & lt; packaging> jar & lt; name> threadpooldemoserver 春天Boot< & lt; description>演示项目;/description> & lt; parent> & lt; groupId> org.springframework.boot & lt; artifactId> spring-boot-starter-parent & lt; version> 1.5.9.RELEASE & lt; relativePath/比;& lt; !——从库中查找父——比; & lt;/parent> & lt; properties> & lt; project.build.sourceEncoding> UTF-8 & lt; project.reporting.outputEncoding> UTF-8 & lt; java.version> 1.8 & lt;/java.version> & lt;/properties> & lt; dependencies> & lt; dependency> & lt; groupId> org.springframework.boot & lt; artifactId> spring-boot-starter-web & lt;/dependency> & lt;/dependencies> & lt; build> & lt; plugins> & lt; plugin> & lt; groupId> org.springframework.boot & lt; artifactId> spring-boot-maven-plugin & lt;/plugin> & lt;/plugins> & lt;/build> & lt;/project>
创建一个服务层的接口AsyncService,如下:
公共接口AsyncService {/* * *执行异步任务 */空白executeAsync (); }
对应的AsyncServiceImpl,实现如下:
@ service 公共类AsyncServiceImpl实现AsyncService { 私有静态最终日志记录器=LoggerFactory.getLogger (AsyncServiceImpl.class); @Override 公共空间executeAsync () { logger.info(“开始executeAsync”); 尝试{ thread . sleep (1000); }捕捉(异常e) { e.printStackTrace (); } logger.info (“executeAsync终结”); } }
这个方法做的事情很简单:睡了一秒钟;
创建一个控制器为你好,里面定义一个http接口,做的事情是调用服务层的服务,如下:
@RestController 公开课你好{ 私有静态最终日志记录器=LoggerFactory.getLogger (Hello.class); @ autowired 私人AsyncService AsyncService; @RequestMapping (“/? 公共字符串提交(){ logger.info(“开始提交”);//调用服务层的任务 asyncService.executeAsync (); logger.info(“提交”); 返回“成功”; } }
至此,我们已经做好了一个http请求的服务,里面做的事情其实是同步的,接下来我们就开始配置springboot的线程池服务,将服务层做的事情都提交到线程池中去处理;
创建一个配置类ExecutorConfig,用来定义如何创建一个ThreadPoolTaskExecutor,要使用@ configuration和@EnableAsync这两个注解,表示这是个配置类,并且是线程池的配置类,如下所示: