博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpringBoot非官方教程 | 第二十三篇: 异步方法
阅读量:7097 次
发布时间:2019-06-28

本文共 4398 字,大约阅读时间需要 14 分钟。

这篇文章主要介绍在springboot 使用异步方法,去请求github api.

创建工程

在pom文件引入相关依赖:

org.springframework.boot
spring-boot-starter
org.springframework
spring-web
com.fasterxml.jackson.core
jackson-databind

创建一个接收数据的实体:

@JsonIgnoreProperties(ignoreUnknown=true)public class User {    private String name;    private String blog;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public String getBlog() {        return blog;    }    public void setBlog(String blog) {        this.blog = blog;    }    @Override    public String toString() {        return "User [name=" + name + ", blog=" + blog + "]";    }}

创建一个请求的 githib的service:

@Servicepublic class GitHubLookupService {    private static final Logger logger = LoggerFactory.getLogger(GitHubLookupService.class);    private final RestTemplate restTemplate;    public GitHubLookupService(RestTemplateBuilder restTemplateBuilder) {        this.restTemplate = restTemplateBuilder.build();    }    @Async    public Future
findUser(String user) throws InterruptedException { logger.info("Looking up " + user); String url = String.format("https://api.github.com/users/%s", user); User results = restTemplate.getForObject(url, User.class); // Artificial delay of 1s for demonstration purposes Thread.sleep(1000L); return new AsyncResult<>(results); }}

通过,RestTemplate去请求,另外加上类@Async 表明是一个异步任务。

开启异步任务:

@SpringBootApplication@EnableAsyncpublic class Application extends AsyncConfigurerSupport {    public static void main(String[] args) {        SpringApplication.run(Application.class, args);    }    @Override    public Executor getAsyncExecutor() {        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();        executor.setCorePoolSize(2);        executor.setMaxPoolSize(2);        executor.setQueueCapacity(500);        executor.setThreadNamePrefix("GithubLookup-");        executor.initialize();        return executor;    }}

通过@EnableAsync开启异步任务;并且配置AsyncConfigurerSupport,比如最大的线程池为2.

测试

测试代码如下:

@Componentpublic class AppRunner implements CommandLineRunner {    private static final Logger logger = LoggerFactory.getLogger(AppRunner.class);    private final GitHubLookupService gitHubLookupService;    public AppRunner(GitHubLookupService gitHubLookupService) {        this.gitHubLookupService = gitHubLookupService;    }    @Override    public void run(String... args) throws Exception {        // Start the clock        long start = System.currentTimeMillis();        // Kick of multiple, asynchronous lookups        Future
page1 = gitHubLookupService.findUser("PivotalSoftware"); Future
page2 = gitHubLookupService.findUser("CloudFoundry"); Future
page3 = gitHubLookupService.findUser("Spring-Projects"); // Wait until they are all done while (!(page1.isDone() && page2.isDone() && page3.isDone())) { Thread.sleep(10); //10-millisecond pause between each check } // Print results, including elapsed time logger.info("Elapsed time: " + (System.currentTimeMillis() - start)); logger.info("--> " + page1.get()); logger.info("--> " + page2.get()); logger.info("--> " + page3.get()); }}

启动程序,控制台会打印:

2017-04-30 13:11:10.351 INFO 1511 — [ GithubLookup-1] com.forezp.service.GitHubLookupService : Looking up PivotalSoftware2017-04-30 13:11:10.351 INFO 1511 — [ GithubLookup-2] com.forezp.service.GitHubLookupService : Looking up CloudFoundry2017-04-30 13:11:13.144 INFO 1511 — [ GithubLookup-2] com.forezp.service.GitHubLookupService : Looking up Spring-Projects

耗时:3908

分析:可以卡的前面2个方法分别在GithubLookup-1 和GithubLookup-2执行,第三个在GithubLookup-2执行,注意因为在配置线程池的时候最大线程为2.如果你把线程池的个数为3的时候,耗时减少。

如果去掉@Async,你会发现,执行这三个方法都在main线程中执行。耗时总结,如下:

2017-04-30 13:13:00.934 INFO 1527 — [ main] com.forezp.service.GitHubLookupService : Looking up PivotalSoftware2017-04-30 13:13:03.571 INFO 1527 — [ main] com.forezp.service.GitHubLookupService : Looking up CloudFoundry2017-04-30 13:13:04.865 INFO 1527 — [ main] com.forezp.service.GitHubLookupService : Looking up Spring-Projects

耗时:5261

通过这一个小的栗子,你应该对异步任务有了一定的了解。

参考资料

源码下载

转载地址:http://wbeql.baihongyu.com/

你可能感兴趣的文章
微信小程序background-image不能直接指定本地图片
查看>>
日志监控_ElasticStack-0003.Logstash输入插件及实际生产案例应用?
查看>>
nginx 错误日志
查看>>
at计划任务
查看>>
mysql(一)-客户端Client相关
查看>>
Socket在手机上的应用
查看>>
ubuntu14 安装 logstash5.3.1
查看>>
grep、egrep、fgrep与正则表达式
查看>>
镜像下载
查看>>
ubuntu 10.04 编译安装最新版本linux-2.6.34内核
查看>>
Linux进程间通信(一)
查看>>
RabbitMQ基于Spring AMQP的Java Config 简单配置实例
查看>>
Spring Cache抽象详解
查看>>
iOS UISlider 通过点击改变value
查看>>
LVM逻辑卷扩展和减少
查看>>
AD中OU与组的区别
查看>>
MyEclipse6.5GA
查看>>
SMO未来的营销市场在哪?
查看>>
谈谈自己对技术的看法
查看>>
tomcat7中配置c3p0数据库连接池
查看>>