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

Spring Boot詳細(xì)打印啟動(dòng)時(shí)異常堆棧信息詳析

 更新時(shí)間:2019年10月01日 09:04:51   作者:恒宇少年  
這篇文章主要給大家介紹了關(guān)于Spring Boot詳細(xì)打印啟動(dòng)時(shí)異常堆棧信息的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Spring Boot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

前言

SpringBoot在項(xiàng)目啟動(dòng)時(shí)如果遇到異常并不能友好的打印出具體的堆棧錯(cuò)誤信息,我們只能查看到簡(jiǎn)單的錯(cuò)誤消息,以致于并不能及時(shí)解決發(fā)生的問(wèn)題,針對(duì)這個(gè)問(wèn)題SpringBoot提供了故障分析儀的概念(failure-analyzer),內(nèi)部根據(jù)不同類(lèi)型的異常提供了一些實(shí)現(xiàn),我們?nèi)绻胱远x該怎么去做?

FailureAnalyzer

SpringBoot提供了啟動(dòng)異常分析接口FailureAnalyzer,該接口位于org.springframework.boot.diagnosticspackage內(nèi)。
內(nèi)部?jī)H提供一個(gè)分析的方法,源碼如下所示:

@FunctionalInterface
public interface FailureAnalyzer {

 /**
 * Returns an analysis of the given {@code failure}, or {@code null} if no analysis
 * was possible.
 * @param failure the failure
 * @return the analysis or {@code null}
 */
 FailureAnalysis analyze(Throwable failure);

}

該接口會(huì)把遇到的異常對(duì)象實(shí)例Throwable failure交付給實(shí)現(xiàn)類(lèi),實(shí)現(xiàn)類(lèi)進(jìn)行自定義處理。

AbstractFailureAnalyzer

AbstractFailureAnalyzer是FailureAnalyzer的基礎(chǔ)實(shí)現(xiàn)抽象類(lèi),實(shí)現(xiàn)了FailureAnalyzer定義的analyze(Throwable failure)方法,并提供了一個(gè)指定異常類(lèi)型的抽象方法analyze(Throwable rootFailure, T cause),源碼如下所示:

public abstract class AbstractFailureAnalyzer<T extends Throwable> implements FailureAnalyzer {

 @Override
 public FailureAnalysis analyze(Throwable failure) {
 T cause = findCause(failure, getCauseType());
 if (cause != null) {
  return analyze(failure, cause);
 }
 return null;
 }

 /**
 * Returns an analysis of the given {@code rootFailure}, or {@code null} if no
 * analysis was possible.
 * @param rootFailure the root failure passed to the analyzer
 * @param cause the actual found cause
 * @return the analysis or {@code null}
 */
 protected abstract FailureAnalysis analyze(Throwable rootFailure, T cause);

 /**
 * Return the cause type being handled by the analyzer. By default the class generic
 * is used.
 * @return the cause type
 */
 @SuppressWarnings("unchecked")
 protected Class<? extends T> getCauseType() {
 return (Class<? extends T>) ResolvableType.forClass(AbstractFailureAnalyzer.class, getClass()).resolveGeneric();
 }

 @SuppressWarnings("unchecked")
 protected final <E extends Throwable> E findCause(Throwable failure, Class<E> type) {
 while (failure != null) {
  if (type.isInstance(failure)) {
  return (E) failure;
  }
  failure = failure.getCause();
 }
 return null;
 }

}

通過(guò)AbstractFailureAnalyzer源碼我們可以看到,它在實(shí)現(xiàn)于FailureAnalyzer的接口方法內(nèi)進(jìn)行了特殊處理,根據(jù)getCauseType()方法獲取當(dāng)前類(lèi)定義的第一個(gè)泛型類(lèi)型,也就是我們需要分析的指定異常類(lèi)型。

獲取泛型異常類(lèi)型后根據(jù)方法findCause判斷Throwable是否與泛型異常類(lèi)型匹配,如果匹配直接返回給SpringBoot進(jìn)行注冊(cè)處理。

SpringBoot提供的分析實(shí)現(xiàn)

SpringBoot內(nèi)部通過(guò)實(shí)現(xiàn)AbstractFailureAnalyzer抽象類(lèi)定義了一系列的針對(duì)性異常類(lèi)型的啟動(dòng)分析,如下圖所示:

指定異常分析

SpringBoot內(nèi)部提供的啟動(dòng)異常分析都是指定具體的異常類(lèi)型實(shí)現(xiàn)的,最常見(jiàn)的一個(gè)錯(cuò)誤就是端口號(hào)被占用(PortInUseException),雖然SpringBoot內(nèi)部提供一個(gè)這個(gè)異常的啟動(dòng)分析,我們也是可以進(jìn)行替換這一異常分析的,我們只需要?jiǎng)?chuàng)建PortInUseException異常的AbstractFailureAnalyzer,并且實(shí)現(xiàn)類(lèi)注冊(cè)給SpringBoot即可,實(shí)現(xiàn)自定義如下所示:

/**
 * 端口號(hào)被占用{@link PortInUseException}異常啟動(dòng)分析
 *
 * @author 恒宇少年
 */
public class PortInUseFailureAnalyzer extends AbstractFailureAnalyzer<PortInUseException> {
 /**
  * logger instance
  */
 static Logger logger = LoggerFactory.getLogger(PortInUseFailureAnalyzer.class);

 @Override
 protected FailureAnalysis analyze(Throwable rootFailure, PortInUseException cause) {
  logger.error("端口被占用。", cause);
  return new FailureAnalysis("端口號(hào):" + cause.getPort() + "被占用", "PortInUseException", rootFailure);
 }
}

注冊(cè)啟動(dòng)異常分析

在上面我們只是編寫(xiě)了指定異常啟動(dòng)分析,我們接下來(lái)需要讓它生效,這個(gè)生效方式比較特殊,類(lèi)似于自定義SpringBoot Starter AutoConfiguration的形式,我們需要在META-INF/spring.factories文件內(nèi)進(jìn)行定義,如下所示:

org.springframework.boot.diagnostics.FailureAnalyzer=\
 org.minbox.chapter.springboot.failure.analyzer.PortInUseFailureAnalyzer

那我們?yōu)槭裁葱枰褂眠@種方式定義呢?

項(xiàng)目啟動(dòng)遇到的異常順序不能確定,很可能在Spring IOC并未執(zhí)行初始化之前就出現(xiàn)了異常,我們不能通過(guò)@Component注解的形式使其生效,所以SpringBoot提供了通過(guò)spring.factories配置文件的方式定義。

啟動(dòng)異常分析繼承關(guān)系

自定義的運(yùn)行異常一般都是繼承自RuntimeException,如果我們定義一個(gè)RuntimeException的異常啟動(dòng)分析實(shí)例會(huì)是什么效果呢?

/**
 * 項(xiàng)目啟動(dòng)運(yùn)行時(shí)異常{@link RuntimeException}統(tǒng)一啟動(dòng)分析
 *
 * @author 恒宇少年
 */
public class ProjectBootUnifiedFailureAnalyzer extends AbstractFailureAnalyzer<RuntimeException> {
 /**
  * logger instance
  */
 static Logger logger = LoggerFactory.getLogger(ProjectBootUnifiedFailureAnalyzer.class);

 @Override
 protected FailureAnalysis analyze(Throwable rootFailure, RuntimeException cause) {
  logger.error("遇到運(yùn)行時(shí)異常", cause);
  return new FailureAnalysis(cause.getMessage(), "error", rootFailure);
 }
}

將該類(lèi)也一并注冊(cè)到spring.factories文件內(nèi),如下所示:

org.springframework.boot.diagnostics.FailureAnalyzer=\
 org.minbox.chapter.springboot.failure.analyzer.PortInUseFailureAnalyzer,\
 org.minbox.chapter.springboot.failure.analyzer.ProjectBootUnifiedFailureAnalyzer

運(yùn)行項(xiàng)目并測(cè)試端口號(hào)被占用異常我們會(huì)發(fā)現(xiàn),并沒(méi)有執(zhí)行ProjectBootUnifiedFailureAnalyzer內(nèi)的analyze方法,而是繼續(xù)執(zhí)行了PortInUseFailureAnalyzer類(lèi)內(nèi)的方法。

那我們將PortInUseFailureAnalyzer這個(gè)啟動(dòng)分析從spring.factories文件內(nèi)暫時(shí)刪除掉,再來(lái)運(yùn)行項(xiàng)目我們會(huì)發(fā)現(xiàn)這時(shí)卻是會(huì)執(zhí)行ProjectBootUnifiedFailureAnalyzer類(lèi)內(nèi)分析方法。

總結(jié)

根據(jù)本章我們了解了SpringBoot提供的啟動(dòng)異常分析接口以及基本抽象實(shí)現(xiàn)類(lèi)的運(yùn)作原理,而且啟動(dòng)異常分析存在分析泛型異常類(lèi)的上下級(jí)繼承關(guān)系,異常子類(lèi)的啟動(dòng)分析會(huì)覆蓋掉異常父類(lèi)的啟動(dòng)分析,如果你想包含全部異常的啟動(dòng)分析可以嘗試使用Exception作為AbstractFailureAnalyzer的泛型參數(shù)。

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • rabbitmq使用springboot實(shí)現(xiàn)direct模式(最新推薦)

    rabbitmq使用springboot實(shí)現(xiàn)direct模式(最新推薦)

    這篇文章主要介紹了rabbitmq使用springboot實(shí)現(xiàn)direct模式,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-07-07
  • 淺談Java枚舉的作用與好處

    淺談Java枚舉的作用與好處

    下面小編就為大家?guī)?lái)一篇淺談Java枚舉的作用與好處。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-07-07
  • Mybatis-Plus查詢中如何排除標(biāo)識(shí)字段

    Mybatis-Plus查詢中如何排除標(biāo)識(shí)字段

    這篇文章主要介紹了Mybatis-Plus查詢中排除標(biāo)識(shí)字段的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Spring Boot + Kotlin整合MyBatis的方法教程

    Spring Boot + Kotlin整合MyBatis的方法教程

    前幾天由于工作需要,便開(kāi)始學(xué)習(xí)了kotlin,java基礎(chǔ)扎實(shí)學(xué)起來(lái)也還算比較快,對(duì)于kotlin這個(gè)編程語(yǔ)言自然是比java有趣一些,下面這篇文章主要給大家介紹了關(guān)于Spring Boot + Kotlin整合MyBatis的方法教程,需要的朋友可以參考下。
    2018-01-01
  • JAVA多線程中join()方法的使用方法

    JAVA多線程中join()方法的使用方法

    雖然關(guān)于討論線程join()方法的博客已經(jīng)非常極其特別多了,但是前幾天我有一個(gè)困惑卻沒(méi)有能夠得到詳細(xì)解釋,當(dāng)系統(tǒng)中正在運(yùn)行多個(gè)線程時(shí),join()到底是暫停了哪些線程,所以本文詳細(xì)解釋一下希望能幫助到和我有相同困惑的同學(xué)
    2021-05-05
  • Java設(shè)計(jì)模式之模板模式(Template模式)介紹

    Java設(shè)計(jì)模式之模板模式(Template模式)介紹

    這篇文章主要介紹了Java設(shè)計(jì)模式之模板模式(Template模式)介紹,定義一個(gè)操作中算法的骨架,將一些步驟的執(zhí)行延遲到其子類(lèi)中,需要的朋友可以參考下
    2015-03-03
  • Java實(shí)現(xiàn)圖片與二進(jìn)制的互相轉(zhuǎn)換

    Java實(shí)現(xiàn)圖片與二進(jìn)制的互相轉(zhuǎn)換

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)圖片與二進(jìn)制的互相轉(zhuǎn)換,將圖片轉(zhuǎn)二進(jìn)制再將二進(jìn)制轉(zhuǎn)成圖片,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • Java讀寫(xiě).properties文件解決中文亂碼問(wèn)題

    Java讀寫(xiě).properties文件解決中文亂碼問(wèn)題

    這篇文章主要介紹了Java讀寫(xiě).properties文件解決中文亂碼問(wèn)題,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2017-11-11
  • 詳解Java String類(lèi)常用方法有哪些

    詳解Java String類(lèi)常用方法有哪些

    今天給大家?guī)?lái)的是關(guān)于Java String的相關(guān)知識(shí),文章圍繞著String類(lèi)常用方法展開(kāi),文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • Java深入分析了解平衡二叉樹(shù)

    Java深入分析了解平衡二叉樹(shù)

    平衡二叉樹(shù)又被稱為AVL樹(shù)(有別于AVL算法),且具有以下性質(zhì):它是一棵空樹(shù)或它的左右兩個(gè)子樹(shù)的高度差的絕對(duì)值不超過(guò)1,并且左右兩個(gè)子樹(shù)都是一棵平衡二叉樹(shù)。本文將詳解介紹一下平衡二叉樹(shù)的原理與實(shí)現(xiàn),需要的可以參考一下
    2022-06-06

最新評(píng)論