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

SpringBoot打印啟動時異常堆棧信息詳解

 更新時間:2019年11月25日 08:16:57   作者:恒宇少年  
在本篇文章里小編給大家整理的是關于SpringBoot打印啟動時異常堆棧信息,有需要的朋友們可以學習下。

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

FailureAnalyzer

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

@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);

}

該接口會把遇到的異常對象實例Throwable failure交付給實現(xiàn)類,實現(xiàn)類進行自定義處理。

AbstractFailureAnalyzer

AbstractFailureAnalyzer是FailureAnalyzer的基礎實現(xiàn)抽象類,實現(xiàn)了FailureAnalyzer定義的analyze(Throwable failure)方法,并提供了一個指定異常類型的抽象方法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;
 }

}

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

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

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

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

指定異常分析

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

/**
 * 端口號被占用{@link PortInUseException}異常啟動分析
 *
 * @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("端口號:" + cause.getPort() + "被占用", "PortInUseException", rootFailure);
 }
}

注冊啟動異常分析

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

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

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

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

啟動異常分析繼承關系

自定義的運行異常一般都是繼承自RuntimeException,如果我們定義一個RuntimeException的異常啟動分析實例會是什么效果呢?

/**
 * 項目啟動運行時異常{@link RuntimeException}統(tǒ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("遇到運行時異常", cause);
  return new FailureAnalysis(cause.getMessage(), "error", rootFailure);
 }
}

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

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

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

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

總結

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

以上就是本次介紹的全部知識點內(nèi)容,希望腳本之家整理的內(nèi)容能夠幫助到大家。

相關文章

  • SkyWalking自定義鏈路追蹤實現(xiàn)步驟

    SkyWalking自定義鏈路追蹤實現(xiàn)步驟

    本文詳細介紹了如何使用SkyWalking進行自定義鏈路追蹤的步驟,包括POM文件依賴和邏輯業(yè)務代碼的編寫,文章最后推薦了腳本之家作為進一步學習的資源
    2024-02-02
  • Java反射機制,如何將一個實體類所有字段賦值為null

    Java反射機制,如何將一個實體類所有字段賦值為null

    這篇文章主要介紹了Java反射機制,如何將一個實體類所有字段賦值為null,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • 如何集成swagger2構建Restful API

    如何集成swagger2構建Restful API

    這篇文章主要介紹了如何集成swagger2構建Restful API,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-11-11
  • Java面向?qū)ο蠡A之多態(tài)性,抽象類和接口

    Java面向?qū)ο蠡A之多態(tài)性,抽象類和接口

    這篇文章主要介紹了Java面向?qū)ο蠡A:多態(tài)性,抽象類和接口,文中代碼可以幫助各位更好的理解學習,有需求的小伙伴可以參考下
    2020-05-05
  • springboot?如何添加webapp文件夾

    springboot?如何添加webapp文件夾

    這篇文章主要介紹了springboot?如何添加webapp文件夾,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • java 教你如何給你的頭像添加一個好看的國旗

    java 教你如何給你的頭像添加一個好看的國旗

    這篇文章主要介紹了java 教你如何給你的頭像添加一個好看的國旗,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-09-09
  • Java中Servlet的生命周期詳解

    Java中Servlet的生命周期詳解

    這篇文章主要介紹了Java中Servlet的生命周期詳解,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-08-08
  • 聊聊spring @Transactional 事務無法使用的可能原因

    聊聊spring @Transactional 事務無法使用的可能原因

    這篇文章主要介紹了spring @Transactional 事務無法使用的可能原因,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • java數(shù)據(jù)結構算法稀疏數(shù)組示例詳解

    java數(shù)據(jù)結構算法稀疏數(shù)組示例詳解

    這篇文章主要為大家介紹了java數(shù)據(jù)結構算法稀疏數(shù)組示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • Java編程實現(xiàn)遞增排序鏈表的合并

    Java編程實現(xiàn)遞增排序鏈表的合并

    這篇文章主要介紹了Java編程實現(xiàn)遞增排序鏈表的合并,兩種方法,代碼分享給大家,供需要的朋友參考。
    2017-10-10

最新評論

临清市| 耒阳市| 鸡西市| 文登市| 渭南市| 松江区| 蓬莱市| 华宁县| 克拉玛依市| 仙桃市| 米林县| 濉溪县| 乐安县| 勃利县| 桦南县| 翁牛特旗| 青铜峡市| 哈巴河县| 云浮市| 湘阴县| 吴堡县| 沙田区| 青岛市| 台前县| 南和县| 柳州市| 土默特右旗| 汶川县| 武义县| 广宁县| 张家界市| 平安县| 房产| 新泰市| 玉树县| 谷城县| 康保县| 云林县| 香河县| 林西县| 辉南县|