欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot異步方法捕捉異常詳解

 更新時(shí)間:2019年09月24日 11:00:21   作者:A 是小阿怪啊  
這篇文章主要為大家詳細(xì)介紹了SpringBoot異步方法捕捉異常,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了SpringBoot異步方法捕捉異常的具體代碼,供大家參考,具體內(nèi)容如下

由于項(xiàng)目中定時(shí)器都采用異步執(zhí)行方式

需要定時(shí)監(jiān)控異步方法執(zhí)行進(jìn)度,異常情況

1 執(zhí)行進(jìn)度

可以設(shè)置是否在執(zhí)行,內(nèi)存中添加執(zhí)行標(biāo)識(shí)即可。

防止多次執(zhí)行可以通過攔截器對(duì)此,標(biāo)識(shí)來判斷,防止多次執(zhí)行定時(shí)器

2 異常捕捉

監(jiān)控異步方法執(zhí)行是否異常。

1 無返回值

配置AsyncExceptionConfig類,統(tǒng)一處理。

定義異常捕獲配置類AsyncExceptionConfig,配置類里面定義SpringAsyncExceptionHandler 方法實(shí)現(xiàn)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 <br/>
 * @version : 1.0
 * @date 2019/9/21
 */
@Configuration
@Slf4j
public class AsyncExceptionConfig implements AsyncConfigurer {
 
 
 
 /**
 * @description : 設(shè)置異步方法線程參數(shù)
 * @author : tizzy
 * @version : 1.0
 */
 @Bean
 @Override
 public Executor getAsyncExecutor() {
 ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
 //根據(jù)自己機(jī)器配置
 executor.setCorePoolSize(8);
 executor.setMaxPoolSize(16);
 executor.setQueueCapacity(64);
 executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
  executor.setThreadNamePrefix("SpringAsyncThread-");
 
  return executor;
 }

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

 class SpringAsyncExceptionHandler implements AsyncUncaughtExceptionHandler {
 @Override
 public void handleUncaughtException(Throwable throwable, Method method, Object... objects) {
 log.info("------我是Async無返回方法的異常處理方法---------");

 //通過反射獲取各個(gè)初始化方法名字
 String methodName = method.getName();
 log.info(" 當(dāng)前異常方法名 == {} " , methodName);
 
 //根據(jù)方法名字 記錄異常 略。。。。

 log.info("------我是Async無返回方法的異常處理方法---------");
 }
 }
}

2 有返回值

返回值 用 AsyncResult 包裝返回
AsyncResult是Future接口的子類,所以也可以通過future.get()獲取返回值的時(shí)候捕獲ExcecutionException。

@Async 
public Future<String> asyncMethod() { 
 
 try { 
 Thread.sleep(5000); 
 return new AsyncResult<String>("hello world !!!!"); 
 } catch (InterruptedException e) { 
 // 
 } 
 
 return null; 
} 

調(diào)用

 try {
 Future future = service.asyncMethod();
 future.get();
 } catch (ExecutionException e) {
 logger.error("exception occurs", e);
 } catch (InterruptedException e) {
 logger.error("exception occurs", e);
 }

什么是 Future類型?

Future是對(duì)于具體的 Runnable或者 Callable任務(wù)的執(zhí)行結(jié)果進(jìn)行取消、查詢是否完成、獲取結(jié)果的接口。必要時(shí)可以通過get方法獲取執(zhí)行結(jié)果,該方法會(huì)阻塞直到任務(wù)返回結(jié)果。

它的接口定義如下:

public interface Future<V> {

 boolean cancel(boolean mayInterruptIfRunning);
 boolean isCancelled();
 boolean isDone();

 V get() throws InterruptedException, ExecutionException;
 V get(long timeout, TimeUnit unit)
 throws InterruptedException, ExecutionException, TimeoutException;

}

它聲明這樣的五個(gè)方法:

cancel方法用來取消任務(wù),如果取消任務(wù)成功則返回true,如果取消任務(wù)失敗則返回false。參數(shù)mayInterruptIfRunning表示是否允許取消正在執(zhí)行卻沒有執(zhí)行完畢的任務(wù),如果設(shè)置true,則表示可以取消正在執(zhí)行過程中的任務(wù)。如果任務(wù)已經(jīng)完成,則無論mayInterruptIfRunning為true還是false,此方法肯定返回false,即如果取消已經(jīng)完成的任務(wù)會(huì)返回false;如果任務(wù)正在執(zhí)行,若mayInterruptIfRunning設(shè)置為true,則返回true,若mayInterruptIfRunning設(shè)置為false,則返回false;如果任務(wù)還沒有執(zhí)行,則無論mayInterruptIfRunning為true還是false,肯定返回true。

isCancelled方法表示任務(wù)是否被取消成功,如果在任務(wù)正常完成前被取消成功,則返回 true。

isDone方法表示任務(wù)是否已經(jīng)完成,若任務(wù)完成,則返回true;

get()方法用來獲取執(zhí)行結(jié)果,這個(gè)方法會(huì)產(chǎn)生阻塞,會(huì)一直等到任務(wù)執(zhí)行完畢才返回;

get(long timeout, TimeUnit unit)用來獲取執(zhí)行結(jié)果,如果在指定時(shí)間內(nèi),還沒獲取到結(jié)果,就直接返回null。

也就是說Future提供了三種功能:

判斷任務(wù)是否完成;

能夠中斷任務(wù);

能夠獲取任務(wù)執(zhí)行結(jié)果。

3 異步方法中事務(wù)

@Async調(diào)用中的事務(wù)處理機(jī)制

在@Async標(biāo)注的方法,同時(shí)也適用了@Transactional進(jìn)行了標(biāo)注;在其調(diào)用數(shù)據(jù)庫(kù)操作之時(shí),將無法產(chǎn)生事務(wù)管理的控制,原因就在于其是基于異步處理的操作。

正確做法

 如何給這些操作添加事務(wù)管理呢?可以將需要事務(wù)管理操作的方法放置到異步方法內(nèi)部,在內(nèi)部被調(diào)用的方法上添加@Transactional.

例如: 

方法A,使用了@Async/@Transactional來標(biāo)注,但是無法產(chǎn)生事務(wù)控制的目的。

方法B,使用了@Async來標(biāo)注,  B中調(diào)用了C、D,C/D分別使用@Transactional做了標(biāo)注,是可以實(shí)現(xiàn)事務(wù)控制的目的。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java設(shè)計(jì)模式七大原則之迪米特法則詳解

    Java設(shè)計(jì)模式七大原則之迪米特法則詳解

    迪米特法則要求一個(gè)對(duì)象應(yīng)該對(duì)其他對(duì)象有最少的了解,所以迪米特法則又叫做最少知識(shí)原則。本文將為大家詳細(xì)介紹Java設(shè)計(jì)模式七大原則之一的迪米特法則,需要的可以參考一下
    2022-02-02
  • java中equals和等號(hào)(==)的區(qū)別淺談

    java中equals和等號(hào)(==)的區(qū)別淺談

    java中equals和等號(hào)(==)的區(qū)別淺談,需要的朋友可以參考一下
    2013-05-05
  • mysql+mybatis下全文搜索的使用方法

    mysql+mybatis下全文搜索的使用方法

    本文主要介紹了mysql+mybatis下全文搜索的使用方法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Java如何實(shí)現(xiàn)長(zhǎng)連接

    Java如何實(shí)現(xiàn)長(zhǎng)連接

    這篇文章主要介紹了Java如何實(shí)現(xiàn)長(zhǎng)連接,幫助大家更好的理解和學(xué)習(xí)Java,感興趣的朋友可以了解下
    2020-09-09
  • 淺談Java中強(qiáng)制類型轉(zhuǎn)換的問題

    淺談Java中強(qiáng)制類型轉(zhuǎn)換的問題

    下面小編就為大家?guī)硪黄獪\談Java中強(qiáng)制類型轉(zhuǎn)換的問題。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-05-05
  • 詳解Spring Boot實(shí)戰(zhàn)之Rest接口開發(fā)及數(shù)據(jù)庫(kù)基本操作

    詳解Spring Boot實(shí)戰(zhàn)之Rest接口開發(fā)及數(shù)據(jù)庫(kù)基本操作

    本篇文章主要介紹了Spring Boot實(shí)戰(zhàn)之Rest接口開發(fā)及數(shù)據(jù)庫(kù)基本操作,具有一定的參考價(jià)值,有興趣的可以了解一下
    2017-07-07
  • java中快速創(chuàng)建帶初始值的List和Map實(shí)例

    java中快速創(chuàng)建帶初始值的List和Map實(shí)例

    下面小編就為大家?guī)硪黄猨ava中快速創(chuàng)建帶初始值的List和Map實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-10-10
  • Spring Security中防護(hù)CSRF功能詳解

    Spring Security中防護(hù)CSRF功能詳解

    這篇文章主要介紹了Spring Security中防護(hù)CSRF功能,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • 詳解Java 序列化與反序列化(Serialization)

    詳解Java 序列化與反序列化(Serialization)

    這篇文章主要介紹了Java 序列化與反序列化(Serialization),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí) 吧
    2019-03-03
  • java日期格式化SimpleDateFormat的使用詳解

    java日期格式化SimpleDateFormat的使用詳解

    這篇文章主要介紹了java SimpleDateFormat使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05

最新評(píng)論