由於專案中定時器都採用非同步執行方式
需要定時監控非同步方法執行進度,異常情況
可以設定是否在執行,記憶體中新增執行標識即可。
防止多次執行可以通過***對此,標識來判斷,防止多次執行定時器
監控非同步方法執行是否異常。
配置asyncexceptionconfig類,統一處理。
定義異常捕獲配置類asyncexceptionconfig,配置類裡面定義springasyncexceptionhandler 方法實現asyncuncaughtexceptionhandler 介面。
**如下:
package cn.bwjf.config;
import cn.bwjf.common.constant.initserviceidenum;
import cn.bwjf.common.tools.initserviceutil;
import lombok.extern.slf4j.slf4j;
import org.springframework.aop.interceptor.asyncuncaughtexceptionhandler;
import org.springframework.context.annotation.configuration;
import org.springframework.scheduling.annotation.asyncconfigurer;
/** * @description : 異常捕獲配置類
* @author : tizzy
* @version : 1.0
* @date 2019/9/21
*/@configuration
@slf4j
public
class
asyncexceptionconfig
implements
asyncconfigurer
@override
public asyncuncaughtexceptionhandler getasyncuncaughtexceptionhandler()
class
springasyncexceptionhandler
implements
asyncuncaughtexceptionhandler
", methodname)
;//根據方法名字 記錄異常 略。。。。
log.
info
("------我是async無返回方法的異常處理方法---------");
}}}
返回值 用 asyncresult 包裝返回
asyncresult是future介面的子類,所以也可以通過future.get()獲取返回值的時候捕獲excecutionexception。
@async
public future
asyncmethod()
catch
(interruptedexception e)
return null;
}
呼叫
try
catch
(executionexception e)
catch
(interruptedexception e)
什麼是 future型別?
future是對於具體的 runnable或者 callable任務的執行結果進行取消、查詢是否完成、獲取結果的介面。必要時可以通過get方法獲取執行結果,該方法會阻塞直到任務返回結果。
它的介面定義如下:
public inte***ce future
它宣告這樣的五個方法:
cancel方法用來取消任務,如果取消任務成功則返回true,如果取消任務失敗則返回false。引數mayinterruptifrunning表示是否允許取消正在執行卻沒有執行完畢的任務,如果設定true,則表示可以取消正在執行過程中的任務。如果任務已經完成,則無論mayinterruptifrunning為true還是false,此方法肯定返回false,即如果取消已經完成的任務會返回false;如果任務正在執行,若mayinterruptifrunning設定為true,則返回true,若mayinterruptifrunning設定為false,則返回false;如果任務還沒有執行,則無論mayinterruptifrunning為true還是false,肯定返回true。
iscancelled方法表示任務是否被取消成功,如果在任務正常完成前被取消成功,則返回 true。
isdone方法表示任務是否已經完成,若任務完成,則返回true;
get()方法用來獲取執行結果,這個方法會產生阻塞,會一直等到任務執行完畢才返回;
get(long timeout, timeunit unit)用來獲取執行結果,如果在指定時間內,還沒獲取到結果,就直接返回null。
也就是說future提供了三種功能:
判斷任務是否完成;
能夠中斷任務;
能夠獲取任務執行結果。
@async呼叫中的事務處理機制
在@async標註的方法,同時也適用了@transactional進行了標註;在其呼叫資料庫操作之時,將無法產生事務管理的控制,原因就在於其是基於非同步處理的操作。
如何給這些操作新增事務管理呢?可以將需要事務管理操作的方法放置到非同步方法內部,在內部被呼叫的方法上新增@transactional.
例如: 方法a,使用了@async/@transactional來標註,但是無法產生事務控制的目的。
方法b,使用了@async來標註, b中呼叫了c、d,c/d分別使用@transactional做了標註,是可以實現事務控制的目的。
springboot非同步方法
方式一 main 方法 開啟 enableasync,方法上加 async 1 使用了 async的方法,會被當成是乙個子執行緒,會在主線程執行完了之後執行,可以看到 controller 先執行完成然後返回狀態,接著 方法才開始執行。2 同乙個類中,乙個方法呼叫另外乙個有 async的方法,註解是...
SpringBoot非官方教程,非同步方法
這篇文章主要介紹在springboot 使用非同步方法,去請求github api.在pom檔案引入相關依賴 org.springframework.bootgroupid spring boot starterartifactid dependency org.springframeworkgro...
Spring Boot 非同步任務
可以使用非同步的方式載入方法 只需在專案入口上定義 enableasync 開啟非同步註解功能 以及某個需要非同步方法上面定義 async註解 即可1.專案入口上定義 enableasync 開啟非同步註解功能 enableasync 開啟非同步註解功能 public class 2.使用 asyn...