`
baobeituping
  • 浏览: 1062398 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

第二十三篇: 异步方法

 
阅读更多

转载请标明出处: 

http://blog.csdn.net/forezp/article/details/71024169 

本文出自方志朋的博客

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

 

创建工程

 

在pom文件引入相关依赖:

 

<dependency>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-starter</artifactId>

        </dependency>

 

        <dependency>

            <groupId>org.springframework</groupId>

            <artifactId>spring-web</artifactId>

        </dependency>

        <dependency>

            <groupId>com.fasterxml.jackson.core</groupId>

            <artifactId>jackson-databind</artifactId>

        </dependency>

 

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

 

@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:

 

@Service

public 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<User> 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

@EnableAsync

public 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.

 

测试

 

测试代码如下:

 

@Component

public 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<User> page1 = gitHubLookupService.findUser("PivotalSoftware");

        Future<User> page2 = gitHubLookupService.findUser("CloudFoundry");

        Future<User> 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 PivotalSoftware 

2017-04-30 13:11:10.351 INFO 1511 — [ GithubLookup-2] com.forezp.service.GitHubLookupService : Looking up CloudFoundry

2017-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 PivotalSoftware 

2017-04-30 13:13:03.571 INFO 1527 — [ main] com.forezp.service.GitHubLookupService : Looking up CloudFoundry 

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

耗时:5261

 

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

分享到:
评论

相关推荐

    SpringBootLearning_forezp.tar.gz

    《SpringBoot非官方教程》 ...SpringBoot非官方教程 | 第二十三篇: 异步方法 SpringBoot非官方教程 | 第二十四篇: springboot整合docker 案例 SpringBoot非官方教程 | 第二十五篇: 2小时学会springboot

    android async异步上传图片

    因此,Android提供了多种异步处理机制,如AsyncTask、Handler/Looper、IntentService、以及第三方库如Volley、OkHttp、Retrofit等。本篇主要讨论使用AsyncTask结合HttpClient进行图片上传。 首先,`android-network...

    使用HttpClient异步请求数据

    但如果你仍然需要使用`HttpClient`,可以通过添加第三方依赖库来实现。 接下来,我们将探讨如何结合`AsyncTask`进行异步操作。`AsyncTask`是Android提供的一个轻量级的后台执行框架,它允许我们在后台线程执行耗时...

    嵌入式Linux应用开发完全手册有目录2

     第23章 IDE接口和SD卡驱动程序移植  第24章 LCD和USB驱动程序移植  第5篇 嵌入式Linux系统应用开发篇  第25章 嵌入式GUI开发 第26章 基于X的GUI开发  第27章 Linux应用程序调试技

    突破JavaScript编程实例五十讲 JavaScript精髓 JavaScript技巧

    第二讲:对象与数组 2.1 对象:掌握对象字面量、构造函数和原型链的基本知识,以及如何操作和修改对象属性。 2.2 数组:学习数组方法,如push、pop、shift、unshift、slice、splice等,以及Array.prototype上的方法...

    Dubbo视频教程--高级篇--第24节--简易版支付系统介绍

    ### Dubbo视频教程--高级篇--第24节--简易版支付系统介绍知识点 #### 1. Dubbo框架与分布式系统架构 Dubbo是一款高性能、轻量级的Java RPC框架,由阿里巴巴开源。它提供了高可用的服务治理能力,在分布式系统中尤为...

    MiniGUI编程指南-V3.0

    第四篇:MiniGUI控件编程,专门介绍了各种控件的编程方法,如静态框(第19章)、按钮(第20章)、列表框(第21章)、编辑框(第22章)、组合框(第23章)、菜单按钮(第24章)、进度条(第25章)、滑块(第26章)、...

    js常用方法大全,比较详细

    本篇文章将详细探讨JS的常用方法,旨在为开发者提供一个全面的参考。 一、变量声明与类型转换 在JavaScript中,我们可以使用`var`, `let`, 和 `const` 关键字来声明变量。`var` 是老式的声明方式,具有变量提升...

    嵌入式Linux应用开发完全手册

    第1篇 嵌入式Linux开发环境...第23章 IDE接口和SD卡驱动程序移植 第24章 LCD和USB驱动程序移植 第5篇 嵌入式Linux系统应用开发篇 第25章 嵌入式GUI开发 第26章 基于X的GUI开发 第27章 Linux应用程序调试技术 参考文献

    Professional ASP.NET MVC3

    #### 十三、扩展MVC篇 - **自定义模块**:讲解如何通过编写自定义模块来扩展ASP.NET MVC3的功能。 - **中间件集成**:介绍如何利用中间件来增强项目的性能或添加额外的功能。 - **插件系统**:提供创建可插拔组件的...

    嵌入式Linux应用开发完全手册有目录1(共2个)

     第23章 IDE接口和SD卡驱动程序移植  第24章 LCD和USB驱动程序移植  第5篇 嵌入式Linux系统应用开发篇  第25章 嵌入式GUI开发 第26章 基于X的GUI开发  第27章 Linux应用程序调试技术

    《Java语言程序设计》(基础篇)例题源代码(程序清单)

    《Java语言程序设计》(基础篇)是一本深入浅出介绍Java编程的教材,其例题源代码覆盖了从基础到进阶的关键知识点,旨在帮助读者掌握编程基础,提升编程能力。以下是根据提供的文件信息整理出的相关Java知识点: 1....

    Visual Basic 2012 Programmer's Reference VB2012程序员参考手册

    ##### 第二部分:入门篇 **第7章:选择Windows Forms控件** - **概述**:指导用户如何根据需求选择合适的Windows Forms控件。 - **知识点**: - 各类标准控件的功能特点及其适用场景。 - 自定义控件的设计原则和...

    十天学会PHP

    第二天:PHP语法基础 - 变量与数据类型:理解PHP中的变量定义,如 `$var`,以及各种数据类型,如整型、浮点型、字符串、布尔型、数组和对象。 - 运算符:学习比较、算术、逻辑、位运算符,以及三元运算符的使用。 - ...

    WEB前端开发初级教案.pdf

    第二篇 HTML5和CSS3开发基础与应用 第一章 HTML5开发基础与应用: 1. 简介:介绍了HTML5的新特性、目的及其在前端开发中的重要性。 2. 常用元素和属性:讲解了HTML5新增和改进的元素和属性,如语义化标签、表单增强...

    数据结构算法

    十字链表 经典算法题每日演练——第二十题 三元组 经典算法题每日演练——第十九题 双端队列 经典算法题每日演练——第十八题 外排序 经典算法题每日演练——第十七题 Dijkstra算法 经典算法题每日演练——第十六题 ...

    Linux设备驱动详解第二版

    Linux设备驱动详解【第二版】,作者宋宝华,此版PDF是经过本人整理的文字版PDF,带目录、高清无水印版。 内容简介 《Linux设备驱动开发详解(第《Linux设备驱动开发详解(第2版)》内容全面,实例丰富,操作性强,...

    河北省2015年下半年电机装配工:电力机车电工考试试题.doc

    5. 三相异步电动机接线:根据国家标准,第二相始端的标识通常是V1。 6. 变节距多速电动机:变节距法用于设计多速电动机绕组,不同节距的线圈在嵌放时会导致电流方向改变。 7. 同心式线圈应用:同心式线圈主要用于...

    Building Web Services with ASP.NET and .NET Remoting

    ##### 第二章:Web服务协议 本章深入探讨了支撑Web服务运作的关键协议,如SOAP(Simple Object Access Protocol)、WSDL(Web Services Description Language)和UDDI(Universal Description, Discovery, and ...

Global site tag (gtag.js) - Google Analytics