摘要:如果去掉,你會(huì)發(fā)現(xiàn),執(zhí)行這三個(gè)方法都在線程中執(zhí)行。耗時(shí)總結(jié),如下耗時(shí)通過這一個(gè)小的栗子,你應(yīng)該對異步任務(wù)有了一定的了解。
這篇文章主要介紹在springboot 使用異步方法,去請求github api.
創(chuàng)建工程在pom文件引入相關(guān)依賴:
org.springframework.boot spring-boot-starter org.springframework spring-web com.fasterxml.jackson.core jackson-databind
創(chuàng)建一個(gè)接收數(shù)據(jù)的實(shí)體:
@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 + "]"; } }
創(chuàng)建一個(gè)請求的 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 FuturefindUser(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 表明是一個(gè)異步任務(wù)。
開啟異步任務(wù):
@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開啟異步任務(wù);并且配置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 Futurepage1 = 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()); } }
啟動(dòng)程序,控制臺(tái)會(huì)打印:
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
耗時(shí):3908
分析:可以卡的前面2個(gè)方法分別在GithubLookup-1 和GithubLookup-2執(zhí)行,第三個(gè)在GithubLookup-2執(zhí)行,注意因?yàn)樵谂渲镁€程池的時(shí)候最大線程為2.如果你把線程池的個(gè)數(shù)為3的時(shí)候,耗時(shí)減少。
如果去掉@Async,你會(huì)發(fā)現(xiàn),執(zhí)行這三個(gè)方法都在main線程中執(zhí)行。耗時(shí)總結(jié),如下:
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
耗時(shí):5261
通過這一個(gè)小的栗子,你應(yīng)該對異步任務(wù)有了一定的了解。
參考資料https://spring.io/guides/gs/a...
源碼下載https://github.com/forezp/Spr...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/71469.html
摘要:本文介紹如何在中使用默認(rèn)的聲明式緩存定義和接口用來統(tǒng)一不同的緩存技術(shù)。在使用集成的時(shí)候,我們需要注冊實(shí)現(xiàn)的的。默認(rèn)使用在我們不使用其他第三方緩存依賴的時(shí)候,自動(dòng)采用作為緩存管理器。源碼下載參考資料揭秘與實(shí)戰(zhàn)二數(shù)據(jù)緩存篇快速入門 本文介紹如何在springboot中使用默認(rèn)的spring cache 聲明式緩存 Spring 定義 CacheManager 和 Cache 接口用來統(tǒng)一不...
摘要:另一種就是用中的位于包下,本質(zhì)是由和實(shí)現(xiàn)的阻塞優(yōu)先級(jí)隊(duì)列。表明了一條消息可在隊(duì)列中存活的最大時(shí)間。當(dāng)某條消息被設(shè)置了或者當(dāng)某條消息進(jìn)入了設(shè)置了的隊(duì)列時(shí),這條消息會(huì)在時(shí)間后死亡成為。 SpringBoot 是為了簡化 Spring 應(yīng)用的創(chuàng)建、運(yùn)行、調(diào)試、部署等一系列問題而誕生的產(chǎn)物,自動(dòng)裝配的特性讓我們可以更好的關(guān)注業(yè)務(wù)本身而不是外部的XML配置,我們只需遵循規(guī)范,引入相關(guān)的依賴就可...
這篇文章主要介紹如何在springboot中如何創(chuàng)建含有多個(gè)module的工程,栗子中含有兩個(gè) module,一個(gè)作為libarary. 工程,另外一個(gè)是主工程,調(diào)用libary .其中l(wèi)ibary jar有一個(gè)服務(wù),main工程調(diào)用這個(gè)服務(wù)。 創(chuàng)建根工程 創(chuàng)建一個(gè)maven 工程,其pom文件為: 4.0.0 com.forezp springboot-multi-...
閱讀 1811·2021-09-03 10:50
閱讀 1340·2019-08-30 15:55
閱讀 3383·2019-08-30 15:52
閱讀 1242·2019-08-30 15:44
閱讀 955·2019-08-30 15:44
閱讀 3328·2019-08-30 14:23
閱讀 3560·2019-08-28 17:51
閱讀 2298·2019-08-26 13:52