1. 程式人生 > >Spring非同步任務處理,@Async的配置和使用

Spring非同步任務處理,@Async的配置和使用

這個註解用於標註某個方法或某個類裡面的所有方法都是需要非同步處理的。被註解的方法被呼叫的時候,會在新執行緒中執行,而呼叫它的方法會在原來的執行緒中執行。這樣可以避免阻塞、以及保證任務的實時性。適用於處理log、傳送郵件、簡訊……等。 註解的應用範圍:
  • 類:表示這個類中的所有方法都是非同步的
  • 方法:表示這個方法是非同步的,如果類也註解了,則以這個方法的註解為準
相關的配置: <task:annotation-driven />配置:
  • executor:指定一個預設的executor給@Async使用。
例子: <task:annotation-driven executor="asyncExecutor" /> <task:executor />配置引數:
  • id:當配置多個executor時,被@Async("id")指定使用;也被作為執行緒名的字首。
  • pool-size
    • core size
      :最小的執行緒數,預設:1
    • max size:最大的執行緒數,預設:Integer.MAX_VALUE
  • queue-capacity:當最小的執行緒數已經被佔用滿後,新的任務會被放進queue裡面,當這個queue的capacity也被佔滿之後,pool裡面會建立新執行緒處理這個任務,直到匯流排程數達到了max size,這時系統會拒絕這個任務並丟擲TaskRejectedException異常(預設配置的情況下,可以通過rejection-policy來決定如何處理這種情況)。預設值為:Integer.MAX_VALUE
  • keep-alive:超過core size的那些執行緒,任務完成後,再經過這個時長(秒)會被結束掉
  • rejection-policy:當pool已經達到max size的時候,如何處理新任務
    • ABORT(預設):丟擲TaskRejectedException異常,然後不執行
    • DISCARD:不執行,也不丟擲異常
    • DISCARD_OLDEST:丟棄queue中最舊的那個任務
    • CALLER_RUNS:不在新執行緒中執行任務,而是有呼叫者所在的執行緒來執行
配置例子:  <task:annotation-driven executor="asyncExecutor" />  <task:executor id="asyncExecutor" pool-size="100-10000" queue-capacity="10
"/> 例項:
 <!-- 預設的非同步任務執行緒池 --> 
 <task:annotation-driven executor="asyncExecutor" />
 <task:executor id="asyncExecutor" pool-size="100-10000" queue-capacity="10" />

 <!-- 處理log的執行緒池 -->
 <task:executor id="logExecutor" pool-size="15-1000" queue-capacity="5" keep-alive="5"/>

 @Override
 @Async("logExecutor")    //如果不指定名字,會使用預設的“asyncExecutor”
 public void saveUserOpLog(TabUserOpLog tabUserOpLog) {
 
  userOpLogDAO.insertTabUserOpLog(tabUserOpLog);
 }
(注意:如果在同一個類中呼叫的話,不會生效,原因請參考:http://blog.csdn.net/clementad/article/details/47339519) 通過log可以看到,已經分開兩個執行緒執行:
執行緒的優先順序和型別: 優先順序:NORM_PRIORITY 型別:非守護執行緒 使用者執行緒(User Thread):JVM會等待所有的使用者執行緒結束後才退出;當系統中沒有使用者執行緒了,JVM也就退出了 守護執行緒(Daemon Thread):一般是為其他執行緒提供服務的執行緒,比如GC垃圾回收器;JVM退出時,不會管守護執行緒是否存在,而是直接退出 所以,對於檔案、資料庫的操作,適宜使用守護執行緒,不然可能會丟失資料! Web應用停止時,Spring容器會被關閉,呼叫者如果是Spring bean,就會停止生成新任務。然而,執行緒池中已經在執行的任務,由於預設是使用者執行緒,所以JVM會等待它們結束後才退出。 附:Java程式設計方式的配置方法:
@Configuration
@EnableAsync
public class SpringConfig {

	/** Set the ThreadPoolExecutor's core pool size. */
	private int corePoolSize = 10;
	/** Set the ThreadPoolExecutor's maximum pool size. */
	private int maxPoolSize = 200;
	/** Set the capacity for the ThreadPoolExecutor's BlockingQueue. */
	private int queueCapacity = 10;

	private String ThreadNamePrefix = "MyLogExecutor-";

	@Bean
	public Executor logExecutor() {
		ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
		executor.setCorePoolSize(corePoolSize);
		executor.setMaxPoolSize(maxPoolSize);
		executor.setQueueCapacity(queueCapacity);
		executor.setThreadNamePrefix(ThreadNamePrefix);

		// rejection-policy:當pool已經達到max size的時候,如何處理新任務
		// CALLER_RUNS:不在新執行緒中執行任務,而是有呼叫者所在的執行緒來執行
		executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
		executor.initialize();
		return executor;
	}

}


相關推薦

Spring非同步任務處理@Async配置使用

這個註解用於標註某個方法或某個類裡面的所有方法都是需要非同步處理的。被註解的方法被呼叫的時候,會在新執行緒中執行,而呼叫它的方法會在原來的執行緒中執行。這樣可以避免阻塞、以及保證任務的實時性。適用於處理log、傳送郵件、簡訊……等。 註解的應用範圍: 類:表示這個類中的

spring的事務管理xml配置註解方式優先順序

在spring中,對於事務的管理可以通過xml配置的方式去設定,也可以通過@Translation註解去設定,如果兩個同時設定了會怎麼樣呢? 測試方法: 1、在xml中設定事務的某個屬性值 2、採用註解設定與xml配置相反的屬性值 3、測試兩次,分別進行

spring自帶的定時任務功能基於註解xml配置

1、spring的配置檔案 <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xml

spring+ActiveMQ+JMS+執行緒池實現簡單的分散式多執行緒多工的非同步任務處理系統

前言:隨著系統的業務功能不斷增強,傳統的單機、單任務,單執行緒的執行模式已經逐漸的被淘汰,取而代之的是分散式,多工,多執行緒,當然,現在開源的這方面的框架也非常的多,大概的思想也都類似,下面就結合我這一年多的工作心得,分享一個簡單易實現的分散式,多工,多執行緒的非同步任務處理系統的基本實現。 1.系統部署圖

springboot2.x簡單詳細教程--整合定時任務非同步任務處理(第十章)

一、SpringBoot定時任務schedule講解      簡介:講解什麼是定時任務和常見定時任務區別         1、常見定時任務 Java自帶的java.util.Timer類  

Spring整合mybatis時資料庫配置com.mysql.jdbc.Drivercom.mysql.cj.jdbc.Driver區別

1、#mysql-connector-java 5 用法 spring.datasource.driver-calss-name=com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnico

springboot的非同步任務(帶返回值不帶返回值的處理

package com.example.demo.async; import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.

spring 配置的三種方式:XML配置JAVA配置註解配置

是否有了這些 IOC 註釋,我們就可以完全摒除原來 XML 配置的方式呢?答案是否定的。有以下幾點原因:註釋配置不一定在先天上優於 XML 配置。如果 Bean 的依賴關係是固定的,(如 Service 使用了哪幾個 DAO 類),這種配置資訊不會在部署時發生調整,那麼註釋配

SpringBoot整合定時任務非同步任務處理 3節課

1、SpringBoot定時任務schedule講解     簡介:講解什麼是定時任務和常見定時任務區別         1、常見定時任務 Java自帶的java.util.Timer類 

Spring框架——批處理(batch)事務(Transaction)

time mil -- 對數 upd gen 客戶 之前 oid 批處理(batch) 批處理(batch)------------>好比快遞員【不能一件一件的送快遞】 - 批處理指的是一次操作中執行多條SQL語句 - 批處理相比於一次一次執行效率會提高很多

Spring之c3p0連接池配置使用

實現 style 操作 except text org mbo c3p0連接池 pda 1、導入包:c3p0和mchange包 2、代碼實現方式: 1 package helloworld.pools; 2 3 import com.mchange.v2.c3p0

Spring Boot +Mybatis 多資料來源的配置使用

1、在application.properties中新增資料庫連線配置     mybatis.type-aliases-package=com.yc.edusys.bean     mybatis.mapper-locations=cla

大資料之Spark(八)--- Spark閉包處理部署模式叢集模式SparkOnYarn模式高可用Spark整合Hive訪問hbase類載入等異常解決使用spark下的thriftserv

一、Spark閉包處理 ------------------------------------------------------------ RDD,resilient distributed dataset,彈性(容錯)分散式資料集。 分割槽列表,function,dep Op

多執行緒非同步任務處理

@(多執行緒&&併發) 多執行緒非同步任務處理 歡迎關注作者部落格 簡書傳送門 文章目錄 多執行緒非同步任務處理 執行緒池

Linux centos7上gitlab伺服器的搭建本地配置使用

1 gitlab的搭建 1. 安裝一堆包,和 啟動相關服務 yum install -y curl policycoreutils-python yum install -y openssh-se

裝修新 Linux 伺服器(資料遷移環境配置埠開放)

Linux 如何變成一個伺服器?如何轉移服務到新的伺服器?且看本篇清單 ☸ 資料遷移 檔案遷移 如果 需要舊伺服器上的一些檔案,就需要進行資料遷移 # 本機 -> 遠端 scp /root [e

idea 使用git管理專案 window配置第一次上傳專案到碼雲

首先測試git是否安裝成功 在cmd中輸入命令 git --version 如果成功會出現版本資訊 註冊申請碼雲賬戶碼雲註冊網址,新建遠端服務專案倉儲,獲得ssh公匙複製留作備用。 首先初始化git git init檢視提交到git上的檔案,並檢視是否提交成功,成功後git s

spring非同步請求action以及預設配置坑爹的效能以及對應效能調優

前言 非同步請求----客戶端一旦發起請求,伺服器立刻將請求丟到其他執行緒處理,而當前的接收執行緒就能閒下來繼續接收客戶端請求了,這個看起來效能槓槓的,這篇文章就來入坑非同步請求。 spring非同步請求的配置 預設配置下的非同步請求效能表現 進行這個操作前

使用spring非同步請求處理以及執行緒池所帶來的坑以及利用visualvm監測執行緒及效能【草稿】

前言 在開始前,請先看看: 因為涉及到執行緒,估計肉眼是沒辦法觀測的了只能用工具了。 預設執行緒池的坑 非同步web開發專題及tomcat下的spring非同步請求配置勘誤 當你按照上文高高興興地配置好非同步支援然後想要開啟高併發的人生,我只能說你圖樣圖森破

spring-boot actuator(監控)配置使用

在生產環境中,需要實時或定期監控服務的可用性。spring-boot 的actuator(監控)功能提供了很多監控所需的介面。簡單的配置和使用如下: 1、引入依賴: <dependency> <groupId>org.springframe