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

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)文章

  • 使用spring通過(guò)aop獲取方法參數(shù)和參數(shù)值

    使用spring通過(guò)aop獲取方法參數(shù)和參數(shù)值

    這篇文章主要介紹了使用spring通過(guò)aop獲取方法參數(shù)和參數(shù)值,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • 一文詳解Spring?Boot可以同時(shí)處理多少請(qǐng)求

    一文詳解Spring?Boot可以同時(shí)處理多少請(qǐng)求

    SpringBoot是一個(gè)流行的Java開(kāi)發(fā)框架,它被廣泛用于構(gòu)建Web應(yīng)用程序,但是,開(kāi)發(fā)人員通常會(huì)擔(dān)心它的性能問(wèn)題,特別是在高負(fù)載條件下,Spring?Boot能夠同時(shí)處理多少請(qǐng)求是一個(gè)重要的問(wèn)題,在本文中,我們將討論SpringBoot的請(qǐng)求處理能力,并介紹如何提高性能
    2023-10-10
  • 通過(guò)Spring Boot + Mybatis + Redis快速搭建現(xiàn)代化Web項(xiàng)目

    通過(guò)Spring Boot + Mybatis + Redis快速搭建現(xiàn)代化Web項(xiàng)目

    本篇文章介紹了如何通過(guò)Spring Boot、Mybatis以及Redis快速搭建一個(gè)現(xiàn)代化的Web項(xiàng)目,并且同時(shí)介紹了如何在Spring Boot下優(yōu)雅地書(shū)寫(xiě)單元測(cè)試來(lái)保證我們的代碼質(zhì)量。具體內(nèi)容詳情大家通過(guò)本文學(xué)習(xí)下吧
    2017-12-12
  • JavaEE實(shí)現(xiàn)基于SMTP協(xié)議的郵件發(fā)送功能

    JavaEE實(shí)現(xiàn)基于SMTP協(xié)議的郵件發(fā)送功能

    這篇文章主要為大家詳細(xì)介紹了JavaEE實(shí)現(xiàn)基于SMTP協(xié)議的郵件發(fā)送功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • java實(shí)現(xiàn)雙層圣誕樹(shù)加修飾代碼示例

    java實(shí)現(xiàn)雙層圣誕樹(shù)加修飾代碼示例

    大家好,本篇文章主要講的是java實(shí)現(xiàn)雙層圣誕樹(shù)加修飾代碼示例,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • springdata jpa單表操作crud的實(shí)例代碼詳解

    springdata jpa單表操作crud的實(shí)例代碼詳解

    這篇文章主要介紹了springdata jpa單表操作crud的實(shí)例代碼詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • SpringBoot整合Lombok插件與使用詳解

    SpringBoot整合Lombok插件與使用詳解

    Lombok是Java開(kāi)發(fā)的插件,通過(guò)注解自動(dòng)生成常用代碼,如getter/setter,節(jié)省開(kāi)發(fā)時(shí)間,提高效率,它在編譯期生成方法,不影響性能,安裝Lombok需要添加Maven依賴(lài)和IDEA插件,使用注解如@Data、@Getter等簡(jiǎn)化代碼編寫(xiě),官網(wǎng)提供詳細(xì)文檔
    2024-09-09
  • Idea報(bào)錯(cuò): A JNI error has occurred的問(wèn)題

    Idea報(bào)錯(cuò): A JNI error has occurred的問(wèn)題

    這篇文章主要介紹了Idea報(bào)錯(cuò): A JNI error has occurred的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • IDEA 錯(cuò)誤 No main class specified的問(wèn)題

    IDEA 錯(cuò)誤 No main class specified的問(wèn)題

    這篇文章主要介紹了IDEA 錯(cuò)誤 No main class specified的問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • Java中ClassLoader類(lèi)加載學(xué)習(xí)總結(jié)

    Java中ClassLoader類(lèi)加載學(xué)習(xí)總結(jié)

    本篇文章主要給大家講述了Java中ClassLoader類(lèi)加載的原理以及用法總結(jié),一起學(xué)習(xí)下。
    2017-12-12

最新評(píng)論

南阳市| 永吉县| 霍林郭勒市| 东安县| 北碚区| 平和县| 云林县| 湘阴县| 墨脱县| 大同县| 来宾市| 改则县| 汉沽区| 石河子市| 高州市| 琼海市| 南阳市| 巧家县| 安塞县| 山丹县| 宁陕县| 恩平市| 衢州市| 墨竹工卡县| 固安县| 泽州县| 陆河县| 平阳县| 密山市| 华容县| 库尔勒市| 雷波县| 万荣县| 旺苍县| 镇江市| 苍梧县| 中西区| 内丘县| 蒙阴县| 蒙山县| 申扎县|