最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring Boot Async異步執(zhí)行任務過程詳解

 更新時間:2020年08月13日 10:17:45   作者:猿天地  
這篇文章主要介紹了Spring Boot Async異步執(zhí)行任務過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

異步調用就是不用等待結果的返回就執(zhí)行后面的邏輯,同步調用則需要等帶結果再執(zhí)行后面的邏輯。

通常我們使用異步操作都會去創(chuàng)建一個線程執(zhí)行一段邏輯,然后把這個線程丟到線程池中去執(zhí)行,代碼如下:

ExecutorService executorService = Executors.newFixedThreadPool(10);
executorService.execute(() -> {
  try {
    // 業(yè)務邏輯
  } catch (Exception e) {
    e.printStackTrace();
  } finally {
  }
 });

這樣的方式看起來沒那么優(yōu)雅,盡管用了java的lambda。在Spring Boot中有一種更簡單的方式來執(zhí)行異步操作,只需要一個@Async注解即可。

@Async
public void saveLog() {
  System.err.println(Thread.currentThread().getName());
}

我們可以直接在Controller中調用這個業(yè)務方法,它就是異步執(zhí)行的,會在默認的線程池中去執(zhí)行。需要注意的是一定要在外部的類中去調用這個方法,如果在本類調用是不起作用的,比如this.saveLog()。 最后在啟動類上開啟異步任務的執(zhí)行,添加@EnableAsync即可。

另外關于執(zhí)行異步任務的線程池我們也可以自定義,首先我們定義一個線程池的配置類,用來配置一些參數(shù),具體代碼如下:

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration; 
/**
 * 異步任務線程池配置
 * 
 * @author yinjihuan
 */
@Configuration
@ConfigurationProperties(prefix = "spring.task.pool")
public class TaskThreadPoolConfig { 
  //核心線程數(shù)
  private int corePoolSize = 5; 
  //最大線程數(shù)
  private int maxPoolSize = 50; 
  //線程池維護線程所允許的空閑時間
  private int keepAliveSeconds = 60; 
  //隊列長度
  private int queueCapacity = 10000;
  //線程名稱前綴
  private String threadNamePrefix = "FSH-AsyncTask-";
  public String getThreadNamePrefix() {
    return threadNamePrefix;
  }
  public void setThreadNamePrefix(String threadNamePrefix) {
    this.threadNamePrefix = threadNamePrefix;
  }
  public int getCorePoolSize() {
    return corePoolSize;
  }
  public void setCorePoolSize(int corePoolSize) {
    this.corePoolSize = corePoolSize;
  }
  public int getMaxPoolSize() {
    return maxPoolSize;
  }
  public void setMaxPoolSize(int maxPoolSize) {
    this.maxPoolSize = maxPoolSize;
  }
  public int getKeepAliveSeconds() {
    return keepAliveSeconds;
  }
  public void setKeepAliveSeconds(int keepAliveSeconds) {
    this.keepAliveSeconds = keepAliveSeconds;
  }
  public int getQueueCapacity() {
    return queueCapacity;
  }
  public void setQueueCapacity(int queueCapacity) {
    this.queueCapacity = queueCapacity;
  }
} 

然后我們重新定義線程池的配置:

import java.lang.reflect.Method;
import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.AsyncConfigurer;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

@Configuration 
public class AsyncTaskExecutePool implements AsyncConfigurer {  
  private Logger logger = LoggerFactory.getLogger(AsyncTaskExecutePool.class);

  @Autowired  
  private TaskThreadPoolConfig config;

  @Override 
  public Executor getAsyncExecutor() { 
    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); 
    executor.setCorePoolSize(config.getCorePoolSize());  
    executor.setMaxPoolSize(config.getMaxPoolSize());  
    executor.setQueueCapacity(config.getQueueCapacity());  
    executor.setKeepAliveSeconds(config.getKeepAliveSeconds());  
    executor.setThreadNamePrefix(config.getThreadNamePrefix());
    //線程池對拒絕任務(無線程可用)的處理策略,目前只支持AbortPolicy、CallerRunsPolicy
    //AbortPolicy:直接拋出java.util.concurrent.RejectedExecutionException異常 -->
    //CallerRunsPolicy:主線程直接執(zhí)行該任務,執(zhí)行完之后嘗試添加下一個任務到線程池中,可以有效降低向線程池內添加任務的速度 -->
    //DiscardOldestPolicy:拋棄舊的任務、暫不支持;會導致被丟棄的任務無法再次被執(zhí)行 -->
    //DiscardPolicy:拋棄當前任務、暫不支持;會導致被丟棄的任務無法再次被執(zhí)行 -->
    executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); 
    executor.initialize();  
    return executor;  
  } 
  @Override 
  public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {// 異步任務中異常處理 
    return new AsyncUncaughtExceptionHandler() { 
      @Override 
      public void handleUncaughtException(Throwable arg0, Method arg1, Object... arg2) { 
        logger.error("=========================="+arg0.getMessage()+"=======================", arg0); 
        logger.error("exception method:" + arg1.getName()); 
      } 
    }; 
  }  
} 

配置完之后我們的異步任務執(zhí)行的線程池就是我們自定義的了,我們可以通過在屬性文件里面配置線程池的大小等等信息,也可以使用默認的配置:

spring.task.pool.maxPoolSize=100

最后講下線程池配置的拒絕策略,當我們的線程數(shù)量高于線程池的處理速度時,任務會被緩存到本地的隊列中,隊列也是有大小的,如果超過了這個大小,我們需要有拒絕的策略,不然就會內存溢出了,目前支持2種拒絕策略:

  • AbortPolicy: 直接拋出java.util.concurrent.RejectedExecutionException異常
  • CallerRunsPolicy: 主線程直接執(zhí)行該任務,執(zhí)行完之后嘗試添加下一個任務到線程池中,可以有效降低向線程池內添加任務的速度
  • 建議大家用CallerRunsPolicy策略,因為當隊列中的任務滿了之后,如果直接拋異常,那么這個任務就會被丟棄,如果是CallerRunsPolicy策略會用主線程去執(zhí)行,就是同步執(zhí)行,最起碼這樣任務不會丟棄。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • SpringSecurity安全框架的使用

    SpringSecurity安全框架的使用

    SpringSecurity是一個用于企業(yè)應用系統(tǒng)的安全框架,可以控制用戶登錄權限,實現(xiàn)不同權限用戶訪問不同內容,文章介紹了SpringSecurity的簡單配置和使用,包括環(huán)境搭建、測試用例和自定義登錄頁面的配置
    2025-02-02
  • SWT(JFace)體驗之打開多個Form

    SWT(JFace)體驗之打開多個Form

    SWT(JFace)體驗之打開多個Form的實現(xiàn)代碼。
    2009-06-06
  • java開發(fā)SSM框架具有rest風格的SpringMVC

    java開發(fā)SSM框架具有rest風格的SpringMVC

    這篇文章主要介紹了java開發(fā)中如何使SSM框架具有rest風格的SpringMVC實現(xiàn)解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-10-10
  • java.lang.IllegalStateException異常解決

    java.lang.IllegalStateException異常解決

    異常是程序在執(zhí)行過程中遇到的錯誤或異常情況,本文就來介紹一下java.lang.IllegalStateException異常解決,感興趣的可以了解一下
    2023-11-11
  • Java數(shù)組的定義與使用

    Java數(shù)組的定義與使用

    數(shù)組是有序的元素序列,若將有限個類型相同的變量的集合命名,那么這個名稱為數(shù)組名。本文通過代碼示例詳細介紹了Java數(shù)組的定義和使用,對學習或工作有一定的幫助,需要的小伙伴歡迎閱讀
    2023-04-04
  • Java中自動生成構造方法詳解

    Java中自動生成構造方法詳解

    這篇文章主要介紹了Java中自動生成構造方法詳解的相關資料,需要的朋友可以參考下
    2017-04-04
  • java代碼如何讀取bootstrap.yml配置信息

    java代碼如何讀取bootstrap.yml配置信息

    這篇文章主要介紹了java代碼如何讀取bootstrap.yml配置信息問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • Spring中的SpringData詳細說明

    Spring中的SpringData詳細說明

    這篇文章主要介紹了Spring中的SpringData詳細說明,Spring Data 是Spring 的一個子項目, 旨在統(tǒng)一和簡化對各類型持久化存儲, 而不拘泥于是關系型數(shù)據(jù)庫還是NoSQL 數(shù)據(jù)存儲,需要的朋友可以參考下
    2023-11-11
  • Java編程計算兔子生兔子的問題

    Java編程計算兔子生兔子的問題

    古典問題:有一對兔子,從出生后第3個月起每個月都生一對兔子,小兔子長到第四個月后每個月又生一對兔子,假如兔子都不死,問每個月的兔子總數(shù)為多少
    2017-02-02
  • FeignClient實現(xiàn)接口調用方式(不同參數(shù)形式)

    FeignClient實現(xiàn)接口調用方式(不同參數(shù)形式)

    這篇文章主要介紹了FeignClient實現(xiàn)接口調用方式(不同參數(shù)形式),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03

最新評論

瓮安县| 遵化市| 台东县| 会同县| 长汀县| 名山县| 桐乡市| 青龙| 建德市| 夏邑县| 凤阳县| 扶余县| 阿瓦提县| 顺平县| 岚皋县| 阿坝县| 卓尼县| 如东县| 南安市| 安新县| 扶绥县| 通州区| 商水县| 葫芦岛市| 淮北市| 日土县| 扶沟县| 肥城市| 洪泽县| 京山县| 泸溪县| 怀宁县| 锡林郭勒盟| 容城县| 曲沃县| 吴川市| 习水县| 得荣县| 屯留县| 肃宁县| 历史|