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

SpringBoot自定義FailureAnalyzer過程解析

 更新時間:2019年11月26日 14:32:31   作者:天宇軒-王  
這篇文章主要介紹了SpringBoot自定義FailureAnalyzer,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

這篇文章主要介紹了SpringBoot自定義FailureAnalyzer,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

官網(wǎng)說明

1.1 創(chuàng)建自己的 FailureAnalyzer

FailureAnalyzer是一種在啟動時攔截 exception 并將其轉(zhuǎn)換為 human-readable 消息的好方法,包含在故障分析中。 Spring Boot 為 application context 相關(guān)的 exceptions,JSR-303 驗證等提供了這樣的分析器。實際上很容易創(chuàng)建自己的。

AbstractFailureAnalyzer是FailureAnalyzer的方便擴(kuò)展,它檢查 exception 中是否存在指定的 exception 類型來處理。你可以從中擴(kuò)展,這樣你的 implementation 只有在它實際存在時才有機(jī)會處理 exception。如果由于某種原因你無法處理 exception,return null給另一個 implementation 一個處理 exception 的機(jī)會。

FailureAnalyzer __mplement 將在META-INF/spring.factories中注冊:以下寄存器ProjectConstraintViolationFailureAnalyzer:

org.springframework.boot.diagnostics.FailureAnalyzer=\
com.example.ProjectConstraintViolationFailureAnalyzer

1.2 排除故障 auto-configuration

Spring Boot auto-configuration 盡力'做正確的事',但有時事情會失敗,而且很難說出原因。

在 Spring Boot ApplicationContext中有一個非常有用的ConditionEvaluationReport可用。如果啟用DEBUG logging 輸出,您將看到它。如果使用spring-boot-actuator,還有一個端點,用 JSON 呈現(xiàn)報表。使用它來調(diào)試 application 并查看 Spring Boot 在運行時添加了哪些 features(以及哪些沒有)。

通過查看 source code 和 Javadoc 可以回答更多問題。一些經(jīng)驗法則:

  • 查找名為*AutoConfiguration的 classes 并讀取它們的源,特別是@Conditional* 注釋,以找出它們啟用的 features 和何時啟用。將--debug添加到命令 line 或 System property -Ddebug以在 console 上添加 log 在您的應(yīng)用程序中做出的所有 auto-configuration 決策。在 running Actuator 應(yīng)用程序中,查看autoconfig端點('/autoconfig'或 JMX 等效項)以獲取相同的信息。
  • 查找@ConfigurationProperties(e.g. ServerProperties)的 classes 并從那里讀取可用的外部 configuration 選項。 @ConfigurationProperties有一個name屬性,作為外部 properties 的前綴,因此ServerProperties有prefix="server",其 configuration properties 是server.port,server.address等。在 running Actuator 應(yīng)用程序中查看configprops端點。
  • 尋找使用RelaxedPropertyResolver從Environment中明確地提取 configuration 值。它通常與前綴一起使用。
  • 查找直接綁定到Environment的@Value 注釋。這不如RelaxedPropertyResolver方法靈活,但允許一些輕松的 binding,特別是 OS 環(huán)境變量(因此CAPITALS_AND_UNDERSCORES是period.separated的同義詞)。
  • 查找@ConditionalOnExpression 注釋,以響應(yīng) SpEL 表達(dá)式打開和關(guān)閉 features,通常使用從Environment解析的占位符進(jìn)行評估。

1.3 在啟動之前自定義 Environment 或 ApplicationContext

SpringApplication具有ApplicationListeners和ApplicationContextInitializers,用于將自定義應(yīng)用于 context 或環(huán)境。 Spring Boot 加載了許多此類自定義項,以便在META-INF/spring.factories內(nèi)部使用。注冊其他方法的方法不止一種:

  • 通過在_運行之前調(diào)用SpringApplication上的addListeners和addInitializers方法,以編程方式為每個 application。
  • 通過設(shè)置context.initializer.classes或context.listener.classes來聲明每個 application。
  • 通過添加META-INF/spring.factories并打包_appar 全部用作 library 的 jar 文件來聲明所有 applications。

SpringApplication向 listeners 發(fā)送一些特殊的ApplicationEvents(甚至在創(chuàng)建 context 之前的一些),然后為ApplicationContext發(fā)布的 events 注冊 listeners

在使用EnvironmentPostProcessor刷新 application context 之前,還可以自定義Environment。每個 implementation 都應(yīng)該在META-INF/spring.factories中注冊:

org.springframework.boot.env.EnvironmentPostProcessor=com.example.YourEnvironmentPostProcessor

implementation 可以加載任意 files 并將它們添加到Environment。例如,此 example 從 classpath 加載 YAML configuration 文件:

public class EnvironmentPostProcessorExample implements EnvironmentPostProcessor {

  private final YamlPropertySourceLoader loader = new YamlPropertySourceLoader();

  @Override
  public void postProcessEnvironment(ConfigurableEnvironment environment,
      SpringApplication application) {
    Resource path = new ClassPathResource("com/example/myapp/config.yml");
    PropertySource<?> propertySource = loadYaml(path);
    environment.getPropertySources().addLast(propertySource);
  }

  private PropertySource<?> loadYaml(Resource path) {
    if (!path.exists()) {
      throw new IllegalArgumentException("Resource " + path + " does not exist");
    }
    try {
      return this.loader.load("custom-resource", path, null);
    }
    catch (IOException ex) {
      throw new IllegalStateException(
          "Failed to load yaml configuration from " + path, ex);
    }
  }

}

Environment已經(jīng)準(zhǔn)備好了 Spring Boot 默認(rèn)加載的所有常用 property 源。因此,可以從環(huán)境中獲取文件的位置。此 example 在列表末尾添加custom-resource property 源,以便在任何其他常用位置中定義的 key 優(yōu)先。自定義 implementation 顯然可以定義另一個 order。

雖然在@SpringBootApplication上使用@PropertySource似乎方便且容易在Environment中加載自定義資源,但我們不推薦它為 Spring Boot 在ApplicationContext刷新之前準(zhǔn)備Environment。通過@PropertySource定義的任何 key 都將被加載太晚而不會對 auto-configuration 產(chǎn)生任何影響。

代碼示例

2.1 指定異常分析

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

/**
 * @author WGR
 * @create 2019/11/24 -- 23:00
 */
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)進(jìn)行定義,如下所示:

org.springframework.boot.diagnostics.FailureAnalyzer=\
 com.topcheer.activiti.analyzer.PortInUseFailureAnalyzer

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

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

測試:啟動2個8080端口

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

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

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=\
com.topcheer.activiti.analyze.PortInUseFailureAnalyzer,\
com.topcheer.activiti.analyze.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)分析方法。

總結(jié)

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

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

相關(guān)文章

  • 淺談java7增強(qiáng)的try語句關(guān)閉資源

    淺談java7增強(qiáng)的try語句關(guān)閉資源

    下面小編就為大家?guī)硪黄獪\談java7增強(qiáng)的try語句關(guān)閉資源。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • Java反射機(jī)制深入理解

    Java反射機(jī)制深入理解

    這篇文章主要介紹了Java反射機(jī)制深入理解的相關(guān)資料,希望通過本文大家能理解這部分內(nèi)容,需要的朋友可以參考下
    2017-09-09
  • java文件重命名(文件批量重命名)實例程序代碼分享

    java文件重命名(文件批量重命名)實例程序代碼分享

    這篇文章主要介紹了java文件重命名的程序代碼,大家參考使用吧
    2013-12-12
  • Spring MVC實現(xiàn)文件上傳和下載

    Spring MVC實現(xiàn)文件上傳和下載

    這篇文章主要為大家詳細(xì)介紹了Spring MVC實現(xiàn)文件上傳和下載,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • Spring通過三級緩存解決循環(huán)依賴問題的過程詳解

    Spring通過三級緩存解決循環(huán)依賴問題的過程詳解

    循環(huán)依賴指的是在對象之間存在相互依賴關(guān)系,形成一個閉環(huán),導(dǎo)致無法準(zhǔn)確地完成對象的創(chuàng)建和初始化,本文主要介紹了Spring通過三級緩存解決循環(huán)依賴的方法,需要的可以參考下
    2023-10-10
  • Java中關(guān)于MouseWheelListener的鼠標(biāo)滾輪事件詳解

    Java中關(guān)于MouseWheelListener的鼠標(biāo)滾輪事件詳解

    這篇文章主要介紹了Java中關(guān)于MouseWheelListener的鼠標(biāo)滾輪事件詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java數(shù)組操作經(jīng)典例題大總結(jié)

    Java數(shù)組操作經(jīng)典例題大總結(jié)

    數(shù)組是在內(nèi)存中存儲相同數(shù)據(jù)類型的連續(xù)的空間,聲明一個數(shù)組就是在內(nèi)存空間中劃出一串連續(xù)的空間,下面這篇文章主要給大家介紹了關(guān)于Java數(shù)組操作經(jīng)典例題的相關(guān)資料,需要的朋友可以參考下
    2022-03-03
  • idea?springBoot項目自動注入mapper為空報錯的解決方法

    idea?springBoot項目自動注入mapper為空報錯的解決方法

    這篇文章主要介紹了idea?springBoot項目自動注入mapper為空報錯的解決方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-03-03
  • JAVA編程不能不知道的反射用法總結(jié)

    JAVA編程不能不知道的反射用法總結(jié)

    這篇文章主要介紹了Java反射技術(shù)原理與用法,結(jié)合實例形式分析了Java反射技術(shù)的基本概念、功能、原理、用法及操作注意事項,需要的朋友可以參考下
    2021-07-07
  • Java自定義映射resultMap定義及用法

    Java自定義映射resultMap定義及用法

    MyBatis的每一個查詢映射的返回類型都是ResultMap,當(dāng)我們提供返回類型屬性是resultType時,MyBatis會自動給我們把對應(yīng)值賦給resultType所指定對象的屬性,當(dāng)我們提供返回類型是resultMap時,將數(shù)據(jù)庫中列數(shù)據(jù)復(fù)制到對象的相應(yīng)屬性上,可以用于復(fù)制查詢,兩者不能同時用
    2022-11-11

最新評論

嵊泗县| 南投县| 黄冈市| 女性| 缙云县| 乾安县| 应用必备| 天等县| 共和县| 科尔| 台州市| 航空| 宝坻区| 德格县| 黄石市| 九江县| 伊宁市| 孟村| 景宁| 惠安县| 曲松县| 都江堰市| 蒙自县| 穆棱市| 尖扎县| 广州市| 南阳市| 吉林省| 斗六市| 长治县| 凤凰县| 衡东县| 刚察县| 新平| 澳门| 随州市| 大姚县| 米易县| 项城市| 涟源市| 夏邑县|