精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

性能提升!@Async與CompletableFuture優(yōu)雅應(yīng)用

開發(fā) 前端
如果異步方法不返回任何值,那么就很難知道方法執(zhí)行時是否發(fā)生了異常。我們可以使用 AsyncUncaughtExceptionHandler 實現(xiàn)來捕獲和處理此類異常。

1. 簡介

@Async 和 CompletableFuture 是實現(xiàn)異步處理的強大工具組合。@Async 是Spring框架提供的一個注解,用于標記方法以表明它將在Spring管理的線程池中的另一個線程上異步執(zhí)行。這使得開發(fā)人員能夠在不阻塞主線程的情況下執(zhí)行耗時的任務(wù),從而提高應(yīng)用程序的整體性能和響應(yīng)速度。

CompletableFuture 是Java 8引入的一個強大的類,它代表了一個可能尚未完成的計算的結(jié)果。CompletableFuture 提供了豐富的API來支持異步編程模式,如回調(diào)、組合操作、錯誤處理等。通過將@Async與CompletableFuture結(jié)合使用,可以實現(xiàn)更高效的異步任務(wù)處理。

接下來,我們將介紹@Async與CompletableFuture結(jié)合的使用。

2. 實戰(zhàn)案例

2.1 @EnableAsync and @Async

Spring 自帶 @EnableAsync 注解,可應(yīng)用于 @Configuration 類以實現(xiàn)異步行為。@EnableAsync 注解會查找標有 @Async 注解的方法,并在后臺線程池中運行這些方法。

@Async 注解方法在單獨的線程中執(zhí)行,并返回 CompletableFuture 來保存異步計算的結(jié)果。

開啟異步功能

@Configuration
@EnableAsync
public class AsyncConfig {
  @Bean(name = "asyncExecutor")
  public Executor asyncExecutor()  {
    int core = Runtime.getRuntime().availableProcessors() ;
    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
    executor.setCorePoolSize(core) ;
    executor.setMaxPoolSize(core) ;
    executor.setQueueCapacity(100) ;
    executor.setThreadNamePrefix("PackAsync-") ;
    executor.initialize() ;
    return executor ;
  }
}

如上我們自定義了線程池,該線程池用來執(zhí)行我們的異步任務(wù)。你也可以不用配置,使用系統(tǒng)默認的線程池。

創(chuàng)建異步任務(wù)

@Async("asyncExecutor")
public CompletableFuture<EmployeeNames> task() {
  // TODO
}

用 @Async 對方法進行注解,該方法應(yīng)異步運行。該方法必須是公共的,可以返回值,也可以不返回值。如果返回值,則應(yīng)使用 Future 接口實現(xiàn)對其進行封裝。

這里指定了使用我們自定義的線程池執(zhí)行異步任務(wù)。

多個異步任務(wù)同時執(zhí)行

CompletableFuture.allOf(
  asyncMethodOne, 
  asyncMethodTwo, 
  asyncMethodThree
).join() ;

要合并多個異步任務(wù)的結(jié)果,通過使用 join() 方法,這將等待所有異步任務(wù)執(zhí)行完成才會繼續(xù)往后執(zhí)行。

2.2 Rest Controller中調(diào)用異步任務(wù)

接下來,我們將創(chuàng)建一個 REST API,從三個遠程服務(wù)異步獲取數(shù)據(jù),當所有三個服務(wù)的響應(yīng)都可用時,再匯總響應(yīng)。

  • 調(diào)用/addresses接口獲取所有地址信息
  • 調(diào)用/phones接口獲取所有電話數(shù)據(jù)
  • 調(diào)用/names接口獲取所有姓名
  • 等待以上3個接口都返回結(jié)果后再進行處理
  • 匯總所有三個應(yīng)用程序接口的響應(yīng),并生成最終響應(yīng)發(fā)送回客戶端 

遠程接口準備

@RestController
public class EmployeeController {
  @GetMapping("/addresses")
  public EmployeeAddresses addresses() {
    // TODO
  }
  @GetMapping("/phones")
  public EmployeePhone phones() {
    // TODO
  }
  @GetMapping("/names")
  public EmployeeNames names() {
    // TODO
  }
}

我們將通過異步的方式調(diào)用上面定義的3個接口。

異步調(diào)用REST API

這些服務(wù)方法將從遠程應(yīng)用程序接口或數(shù)據(jù)庫中提取數(shù)據(jù),必須在不同的線程中并行運行,以加快處理速度。

@Service
public class AsyncService {
  private static Logger logger = LoggerFactory.getLogger(AsyncService.class);
  private final RestTemplate restTemplate;
  public AsyncService(RestTemplate restTemplate) {
    this.restTemplate = restTemplate ;
  }
  @Async("asyncExecutor")
  public CompletableFuture<EmployeeNames> names()  {
    logger.info("getEmployeeName starts");
    EmployeeNames employeeNameData = restTemplate.getForObject("http://localhost:8080/names", EmployeeNames.class) ;
    logger.info("employeeNameData, {}", employeeNameData) ;
    logger.info("employeeNameData completed");
    return CompletableFuture.completedFuture(employeeNameData);
  }
  @Async("asyncExecutor")
  public CompletableFuture<EmployeeAddresses> addresses() {
    logger.info("getEmployeeAddress starts");
    EmployeeAddresses employeeAddressData = restTemplate.getForObject("http://localhost:8080/addresses", EmployeeAddresses.class);
    logger.info("employeeAddressData, {}", employeeAddressData) ;
    logger.info("employeeAddressData completed");
    return CompletableFuture.completedFuture(employeeAddressData);
  }
  @Async("asyncExecutor")
  public CompletableFuture<EmployeePhone> phones() {
    logger.info("getEmployeePhone starts") ;
    EmployeePhone employeePhoneData = restTemplate.getForObject("http://localhost:8080/phones", EmployeePhone.class) ;
    logger.info("employeePhoneData, {}", employeePhoneData) ;
    logger.info("employeePhoneData completed") ;
    return CompletableFuture.completedFuture(employeePhoneData) ;
  }
}

注意:你可不能如下方式來執(zhí)行遠程接口的調(diào)用。

CompletableFuture.supplyAsync(() -> {
  return restTemplate.getForObject("http://localhost:8080/phones", EmployeePhone.class) ;
}) ;

如果你這樣寫,你的遠程接口并非在你的異步線程中執(zhí)行,而是在CompletableFuturue的線程池中執(zhí)行(ForkJoinPool)。

2.3 聚合異步任務(wù)

接下來在REST API中調(diào)用上面的異步方法、消耗和聚合其響應(yīng)并返回客戶端。

@RestController
public class AsyncController {
  private final AsyncService asyncService;
  public AsyncController(AsyncService service) {
    this.asyncService = asyncService ;
  }


  @GettMapping("/profile/infos")
  public EmployeeDTO infos() throws Exception {
    CompletableFuture<EmployeeAddresses> addresses = asyncService.addresses() ;
    CompletableFuture<EmployeeNames> names = asyncService.names() ;
    CompletableFuture<EmployeePhone> phones = asyncService.phones() ;
    // 等待所有異步任務(wù)都執(zhí)行完成
    CompletableFuture.allOf(addresses, names, phones).join() ;
    return new EmployeeDTO(addresses.get(), names.get(), phones.get()) ;
  }
}

整個請求的耗時將會是請求最長REST API調(diào)用所用的時間,這大大提升該接口的性能。

2.4 異常處理

當方法的返回類型是 Future 時,F(xiàn)uture.get() 方法會拋出異常,我們應(yīng)該在聚合結(jié)果之前使用 try-catch 塊捕獲并處理異常。

問題是,如果異步方法不返回任何值,那么就很難知道方法執(zhí)行時是否發(fā)生了異常。我們可以使用 AsyncUncaughtExceptionHandler 實現(xiàn)來捕獲和處理此類異常。

@Configuration
public class AsyncConfig implements AsyncConfigurer {


  @Override
  public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
    return new AsyncExceptionHandler() ;
  }


  public class AsyncExceptionHandler implements AsyncUncaughtExceptionHandler {
    private final Logger logger = LoggerFactory.getLogger(AsyncExceptionHandler.class);
    @Override
    public void handleUncaughtException(Throwable ex, Method method, Object... params) {
      logger.error("Unexpected asynchronous exception at : "
        + method.getDeclaringClass().getName() + "." + method.getName(), ex);
    }
  }
}

責任編輯:武曉燕 來源: Spring全家桶實戰(zhàn)案例源碼
相關(guān)推薦

2024-08-06 09:43:54

Java 8工具編程

2024-09-14 11:31:27

@AsyncSpring異步

2024-08-30 09:53:17

Java 8編程集成

2018-09-18 16:20:08

Asyncjavascript前端

2023-11-06 08:01:09

Go同步異步

2023-04-09 16:34:49

JavaSemaphore開發(fā)

2024-09-19 08:09:37

MySQL索引數(shù)據(jù)庫

2009-08-25 15:35:45

citrxinetscalerncore

2011-10-17 09:47:53

應(yīng)用性能工作負載服務(wù)器

2023-08-31 19:17:23

2020-10-27 08:24:01

Java

2018-12-10 15:13:06

緩存系統(tǒng)性能數(shù)據(jù)

2015-01-21 15:40:44

GoRuby

2022-11-27 08:12:11

RocketMQ源碼工具類

2009-06-26 14:13:38

OSCache

2013-12-02 17:33:52

Radware

2010-01-21 23:29:06

戴爾銀行東亞銀行

2011-09-20 10:41:45

Web

2012-09-04 09:18:02

NPBBYOD

2023-11-06 09:32:52

Java實踐
點贊
收藏

51CTO技術(shù)棧公眾號

在线免费黄色av| 精品少妇人妻av一区二区三区| 98在线视频| 国产一区二区三区黄视频| 欧美疯狂做受xxxx高潮| xxxx日本免费| 国产精品视频一区二区三区| 黄色一区二区在线观看| 亚洲一区二区三区免费观看| 懂色av一区二区三区四区| 日韩成人精品视频| 欧美精品九九久久| 国产精品18在线| 超碰成人免费| 欧美日韩国产高清一区二区 | 国产精品伦理一区| 亚洲一区二区成人| 麻豆成人在线看| 日韩精品无码一区二区三区久久久| 国产精品日本一区二区不卡视频| 午夜电影网亚洲视频| 国产又大又长又粗又黄| 青草久久伊人| 成人免费毛片aaaaa**| 国产精品视频精品| 国产成人在线视频观看| 欧美a级在线| 这里只有精品丝袜| 美女爆乳18禁www久久久久久| 一区中文字幕| 欧美一区二区精品在线| 欧美大尺度做爰床戏| 免费高潮视频95在线观看网站| 亚洲精品中文字幕在线观看| 午夜精品亚洲一区二区三区嫩草| 四虎影视在线观看2413| 成人美女视频在线看| 亚洲一区二区三区在线视频| 伊人久久成人网| 老司机久久99久久精品播放免费| 国模视频一区二区三区| 免费一级肉体全黄毛片| 久久久久电影| 日韩在线观看免费高清| 日本精品久久久久中文| 精品视频免费| 影音先锋日韩有码| 四虎国产精品成人免费入口| 亚洲区小说区图片区qvod| 日韩av在线播放资源| 国产不卡的av| 欧美日韩午夜电影网| 在线不卡免费欧美| 午夜xxxxx| 成人av在线播放| 欧美日本在线看| 四季av一区二区| 国产毛片精品久久| 欧美日韩黄视频| 午夜精品中文字幕| www.成人在线.com| 日韩欧美国产电影| www.美色吧.com| 加勒比中文字幕精品| 亚洲黄在线观看| 91精品人妻一区二区| 红桃视频在线观看一区二区| 最近2019年手机中文字幕| 国精产品久拍自产在线网站| 亚洲乱码在线| 久久免费福利视频| 天天干天天干天天| 美女尤物国产一区| 91久热免费在线视频| 亚洲a视频在线| 99re视频这里只有精品| 欧美激情视频一区二区三区| 国产视频精选在线| 综合分类小说区另类春色亚洲小说欧美| 综合视频免费看| 国产又色又爽又黄刺激在线视频| 精品久久久久久久久久久| 免费日韩中文字幕| 成人在线视频区| 日韩av在线资源| 丁香花五月婷婷| 午夜精品免费| 日本不卡高字幕在线2019| 一区二区视频在线免费观看| 国产成人精品三级| 欧美日韩亚洲一区二区三区四区| 色综合久久影院| 亚洲影视在线播放| 人妻内射一区二区在线视频| 四虎影视精品永久在线观看| 精品成人佐山爱一区二区| 法国空姐电影在线观看| 综合天堂av久久久久久久| 777精品视频| 国产一区二区女内射| 9l国产精品久久久久麻豆| 亚洲看片网站| av女在线播放| 欧美电影在线免费观看| 日本japanese极品少妇| 希岛爱理一区二区三区| 日本亚洲精品在线观看| 国产成人三级在线播放| 国产日韩欧美高清| 亚洲人成无码网站久久99热国产 | 成人两性免费视频| 日韩福利一区二区| 一区二区视频在线| www.涩涩涩| 亚洲精品播放| 欧美激情网友自拍| 国产情侣一区二区| 国产欧美日韩久久| 黄色免费视频大全| av一级亚洲| 蜜臀久久99精品久久久无需会员| 亚洲自拍一区在线观看| 成人av电影在线播放| 日韩视频在线免费播放| gogo亚洲高清大胆美女人体| 亚洲国产成人av在线| 青娱乐国产在线| 狠狠v欧美v日韩v亚洲ⅴ| 日本在线视频一区| 中文字幕在线直播| 欧美精品一区二区三区久久久 | blacked蜜桃精品一区| 国内精品视频久久| 高潮毛片7777777毛片| 亚洲欧美福利一区二区| 欧美激情第3页| 精品国产一区二区三区久久久樱花 | 欧美另类专区| 91亚洲国产精品| 激情在线小视频| 欧美日韩不卡在线| 呻吟揉丰满对白91乃国产区| 久久精品二区三区| 欧美在线3区| 国产成人精品123区免费视频| 日韩精品在线免费观看| 国产特黄大片aaaa毛片| 成人午夜电影久久影院| 成年人网站国产| 豆花视频一区二区| 91精品国产九九九久久久亚洲| 高h震动喷水双性1v1| 亚洲第一精品在线| 一级国产黄色片| 国产欧美日韩综合一区在线播放| 精品亚洲一区二区三区四区五区高| caoporn视频在线| 日韩成人av网址| 天堂网中文字幕| 国产欧美精品一区| 天天操天天干天天做| 综合激情一区| 精品无人乱码一区二区三区的优势| 在线免费看h| 国产一区二区成人| 国产精品爽爽久久| 一区二区三区免费| 中文字幕在线永久| 日韩av午夜在线观看| 一区二区三区不卡在线| 久久av网站| 国语自产偷拍精品视频偷| 欧美在线一卡| 欧美日韩精品一区二区三区蜜桃| 亚洲熟女毛茸茸| 丰满白嫩尤物一区二区| 37pao成人国产永久免费视频| 日本午夜一区| 亚洲自拍偷拍色图| 中文在线免费二区三区| 在线成人免费网站| 午夜精品久久久久久久99| 欧美视频在线免费看| 亚欧精品视频一区二区三区| 国产激情一区二区三区桃花岛亚洲| 免费看毛片的网址| 精品国产aⅴ| 97超级碰碰| 久久毛片亚洲| 久久中文字幕在线| 青青草av免费在线观看| 欧美精品久久天天躁| 久久高清免费视频| 国产精品久久一卡二卡| 国产51自产区| 欧美深夜福利视频| 99欧美视频| 老司机精品福利在线观看| 亚洲综合资源| 人人爽久久涩噜噜噜网站| 中文在线手机av| 亚洲欧洲国产一区| 亚洲国产精品视频在线| 欧美三级中文字| 国产午夜精品一区二区理论影院| 欧美经典三级视频一区二区三区| 99热超碰在线| 韩国视频一区二区| 国产精品视频黄色| 中文高清一区| mm131午夜| 日韩欧美视频| 蜜桃视频日韩| 荡女精品导航| 亚洲一区二区久久久久久| 欧美日韩不卡| 91精品国产99| 99久久精品免费看国产小宝寻花| 日韩中文字幕在线播放| 国产在线视频网站| 日韩精品免费在线播放| 亚洲福利在线观看视频| 欧美区视频在线观看| 国产精品熟女视频| 狠狠做深爱婷婷久久综合一区 | 性囗交免费视频观看| 精品一区中文字幕| 国产原创精品在线| 蜜桃视频一区二区三区| 免费裸体美女网站| 免费欧美在线| 91国视频在线| 国产日本精品| 国产中文字幕免费观看| 亚洲日本国产| 日韩视频在线视频| 欧美日韩少妇| 黄色一级片国产| 欧美va天堂在线| 992tv成人免费观看| 91一区二区| 最新av在线免费观看| 天天影视天天精品| 免费观看黄色的网站| 亚洲国产精品综合久久久| 国产精品99久久久久久大便| 欧美成免费一区二区视频| 色一情一乱一伦一区二区三区| 国产永久精品大片wwwapp| 欧美午夜精品久久久久久蜜| 日韩av系列| 欧美成人dvd在线视频| 久久99国产成人小视频| 秋霞毛片久久久久久久久| 国产成人短视频在线观看| 日韩av一区二区三区美女毛片| 国产一区二区三区天码| 亚洲国产精品综合| 久久精品一区二区不卡| 欧美一二三不卡| 亚洲国产高清视频| 激情六月丁香婷婷| 蜜臀久久99精品久久久久久9| 天天干天天av| 国产成人精品aa毛片| 一女三黑人理论片在线| 久久久久久久久久久久久女国产乱| 91中文字幕永久在线| 国产精品乱人伦一区二区| 青青青在线免费观看| 亚洲电影在线播放| 中文精品久久久久人妻不卡| 欧美久久久影院| 精品国产乱码久久久久久蜜臀网站| 精品久久五月天| 欧美老女人性开放| 日日噜噜噜夜夜爽亚洲精品| 啦啦啦中文在线观看日本| 日本道色综合久久影院| 亚洲欧美久久精品| 国产在线精品一区二区三区| 国产探花在线精品| 久久精品在线免费视频| 国产一区二区精品| 天堂av2020| 99re在线精品| 日韩欧美123区| 日韩欧美在线播放| 国产女人高潮时对白| 日韩电影在线观看中文字幕| 无遮挡动作视频在线观看免费入口| 欧美二区乱c黑人| 欧美人体一区二区三区| 91成人理论电影| 激情综合网站| 亚洲熟妇无码一区二区三区导航| 日韩成人免费电影| 欧美xxxxx少妇| 欧美韩国一区二区| 日韩欧美亚洲视频| 欧美一级免费观看| seseavlu视频在线| 97国产精品视频人人做人人爱| 国产精品4hu.www| 国产主播一区二区三区四区| 99久久99视频只有精品| 99999精品视频| 国产精品一区二区三区网站| 午夜影院黄色片| 图片区小说区区亚洲影院| 国产又粗又长视频| 亚洲欧美一区二区三区在线| 日本电影在线观看| 国产免费久久av| 综合色就爱涩涩涩综合婷婷| 日本黄色片一级片| 黄色小说综合网站| 一级黄色录像毛片| 欧美日韩在线影院| 成人精品在线播放| 久久av.com| 亚洲高清影院| 四虎影院一区二区三区| 免播放器亚洲| 精品无码国产一区二区三区51安| ㊣最新国产の精品bt伙计久久| 国产精品免费无遮挡无码永久视频| 精品国精品国产尤物美女| 成视频免费观看在线看| 国产欧美日韩专区发布| 精品国产一区二区三区噜噜噜 | 韩国三级在线一区| 三级黄色片在线观看| 在线观看视频91| 国产天堂素人系列在线视频| 欧洲一区二区视频| 日韩成人一级| 国产免费黄色av| 99视频超级精品| 日韩美女黄色片| 亚洲大胆人体视频| av剧情在线观看| 精品国产乱码久久久久| 日韩午夜高潮| 中文字幕av网址| 日本久久精品电影| 福利视频在线看| 国产精品日韩在线| 久久中文视频| 无套内谢丰满少妇中文字幕| 曰韩精品一区二区| 内射无码专区久久亚洲| 午夜精品三级视频福利| 菁菁伊人国产精品| 国产91对白刺激露脸在线观看| 久久久91精品国产一区二区精品| www毛片com| 深夜福利91大全| 国产一区二区久久久久| 777久久精品一区二区三区无码 | 在线观看区一区二| 91xxx在线观看| 亚洲一区久久久| 亚洲伦理精品| 国产人妻大战黑人20p| 欧美日韩精品二区第二页| a免费在线观看| 国产综合精品一区二区三区| 美女尤物久久精品| 综合 欧美 亚洲日本| 日韩欧美在线1卡| 国产传媒在线观看| 五月天丁香综合久久国产| 狠狠色狠狠色综合日日91app| 欧美激情一区二区视频| 亚洲国模精品一区| 成人久久网站| 草草草视频在线观看| 99在线精品一区二区三区| 中文字幕+乱码+中文字幕明步| 久久久久北条麻妃免费看| 国产一区二区三区不卡av| 九热视频在线观看| 亚洲最新在线观看| 国产一级片在线| 3d动漫精品啪啪一区二区三区免费| 制服诱惑一区二区| 中文字幕精品亚洲| 亚洲国产精品电影| 岛国精品在线| 日韩一级片免费视频| 日本一区二区三区高清不卡| 亚洲精品一区二区三区蜜桃 | 97久久久久久久| 日韩一区二区福利| 日韩精品免费一区二区夜夜嗨| 欧美成年人视频在线观看| 性久久久久久久久| 天堂资源在线中文| 久久久www免费人成黑人精品|