国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

SpringBoot非官方教程 | 第二十三篇: 異步方法

jackwang / 1805人閱讀

摘要:如果去掉,你會發現,執行這三個方法都在線程中執行。耗時總結,如下耗時通過這一個小的栗子,你應該對異步任務有了一定的了解。

這篇文章主要介紹在springboot 使用異步方法,去請求github api.

創建工程

在pom文件引入相關依賴:

</>復制代碼

  1. org.springframework.boot
  2. spring-boot-starter
  3. org.springframework
  4. spring-web
  5. com.fasterxml.jackson.core
  6. jackson-databind

創建一個接收數據的實體:

</>復制代碼

  1. @JsonIgnoreProperties(ignoreUnknown=true)
  2. public class User {
  3. private String name;
  4. private String blog;
  5. public String getName() {
  6. return name;
  7. }
  8. public void setName(String name) {
  9. this.name = name;
  10. }
  11. public String getBlog() {
  12. return blog;
  13. }
  14. public void setBlog(String blog) {
  15. this.blog = blog;
  16. }
  17. @Override
  18. public String toString() {
  19. return "User [name=" + name + ", blog=" + blog + "]";
  20. }
  21. }

創建一個請求的 githib的service:

</>復制代碼

  1. @Service
  2. public class GitHubLookupService {
  3. private static final Logger logger = LoggerFactory.getLogger(GitHubLookupService.class);
  4. private final RestTemplate restTemplate;
  5. public GitHubLookupService(RestTemplateBuilder restTemplateBuilder) {
  6. this.restTemplate = restTemplateBuilder.build();
  7. }
  8. @Async
  9. public Future findUser(String user) throws InterruptedException {
  10. logger.info("Looking up " + user);
  11. String url = String.format("https://api.github.com/users/%s", user);
  12. User results = restTemplate.getForObject(url, User.class);
  13. // Artificial delay of 1s for demonstration purposes
  14. Thread.sleep(1000L);
  15. return new AsyncResult<>(results);
  16. }
  17. }

通過,RestTemplate去請求,另外加上類@Async 表明是一個異步任務。

開啟異步任務:

</>復制代碼

  1. @SpringBootApplication
  2. @EnableAsync
  3. public class Application extends AsyncConfigurerSupport {
  4. public static void main(String[] args) {
  5. SpringApplication.run(Application.class, args);
  6. }
  7. @Override
  8. public Executor getAsyncExecutor() {
  9. ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
  10. executor.setCorePoolSize(2);
  11. executor.setMaxPoolSize(2);
  12. executor.setQueueCapacity(500);
  13. executor.setThreadNamePrefix("GithubLookup-");
  14. executor.initialize();
  15. return executor;
  16. }
  17. }

通過@EnableAsync開啟異步任務;并且配置AsyncConfigurerSupport,比如最大的線程池為2.

測試

測試代碼如下:

</>復制代碼

  1. @Component
  2. public class AppRunner implements CommandLineRunner {
  3. private static final Logger logger = LoggerFactory.getLogger(AppRunner.class);
  4. private final GitHubLookupService gitHubLookupService;
  5. public AppRunner(GitHubLookupService gitHubLookupService) {
  6. this.gitHubLookupService = gitHubLookupService;
  7. }
  8. @Override
  9. public void run(String... args) throws Exception {
  10. // Start the clock
  11. long start = System.currentTimeMillis();
  12. // Kick of multiple, asynchronous lookups
  13. Future page1 = gitHubLookupService.findUser("PivotalSoftware");
  14. Future page2 = gitHubLookupService.findUser("CloudFoundry");
  15. Future page3 = gitHubLookupService.findUser("Spring-Projects");
  16. // Wait until they are all done
  17. while (!(page1.isDone() && page2.isDone() && page3.isDone())) {
  18. Thread.sleep(10); //10-millisecond pause between each check
  19. }
  20. // Print results, including elapsed time
  21. logger.info("Elapsed time: " + (System.currentTimeMillis() - start));
  22. logger.info("--> " + page1.get());
  23. logger.info("--> " + page2.get());
  24. logger.info("--> " + page3.get());
  25. }
  26. }

啟動程序,控制臺會打印:

</>復制代碼

  1. 2017-04-30 13:11:10.351 INFO 1511 — [ GithubLookup-1] com.forezp.service.GitHubLookupService : Looking up PivotalSoftware
  2. 2017-04-30 13:11:10.351 INFO 1511 — [ GithubLookup-2] com.forezp.service.GitHubLookupService : Looking up CloudFoundry
  3. 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線程中執行。耗時總結,如下:

</>復制代碼

  1. 2017-04-30 13:13:00.934 INFO 1527 — [ main] com.forezp.service.GitHubLookupService : Looking up PivotalSoftware
  2. 2017-04-30 13:13:03.571 INFO 1527 — [ main] com.forezp.service.GitHubLookupService : Looking up CloudFoundry
  3. 2017-04-30 13:13:04.865 INFO 1527 — [ main] com.forezp.service.GitHubLookupService : Looking up Spring-Projects

耗時:5261

通過這一個小的栗子,你應該對異步任務有了一定的了解。

參考資料

https://spring.io/guides/gs/a...

源碼下載

https://github.com/forezp/Spr...

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/71469.html

相關文章

  • SpringBoot官方教程 | 第三篇springboot集成spring cache

    摘要:本文介紹如何在中使用默認的聲明式緩存定義和接口用來統一不同的緩存技術。在使用集成的時候,我們需要注冊實現的的。默認使用在我們不使用其他第三方緩存依賴的時候,自動采用作為緩存管理器。源碼下載參考資料揭秘與實戰二數據緩存篇快速入門 本文介紹如何在springboot中使用默認的spring cache 聲明式緩存 Spring 定義 CacheManager 和 Cache 接口用來統一不...

    Magicer 評論0 收藏0
  • 一起來學SpringBoot | 第三篇:RabbitMQ延遲隊列

    摘要:另一種就是用中的位于包下,本質是由和實現的阻塞優先級隊列。表明了一條消息可在隊列中存活的最大時間。當某條消息被設置了或者當某條消息進入了設置了的隊列時,這條消息會在時間后死亡成為。 SpringBoot 是為了簡化 Spring 應用的創建、運行、調試、部署等一系列問題而誕生的產物,自動裝配的特性讓我們可以更好的關注業務本身而不是外部的XML配置,我們只需遵循規范,引入相關的依賴就可...

    selfimpr 評論0 收藏0
  • SpringBoot官方教程 | 二十二篇: 創建含有多module的springboot工程

    這篇文章主要介紹如何在springboot中如何創建含有多個module的工程,栗子中含有兩個 module,一個作為libarary. 工程,另外一個是主工程,調用libary .其中libary jar有一個服務,main工程調用這個服務。 創建根工程 創建一個maven 工程,其pom文件為: 4.0.0 com.forezp springboot-multi-...

    Scott 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<