SpringBoot中FailureAnalyzer的使用詳解
FailureAnalyzer的使用
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot</artifactId>
</dependency>
功能定位:攔截啟動(dòng)時(shí)異常,將異常轉(zhuǎn)換成更加易讀的信息并包裝成org.springframework.boot.diagnostics.FailureAnalysis對(duì)象,監(jiān)控應(yīng)用啟動(dòng)過(guò)程。
FailureAnalysis是一個(gè)POJO:
@Getter
@AllArgsConstructor
public class FailureAnalysis {
private final String description;
private final String action;
private final Throwable cause;
}FailureAnalyzer接口:
public interface FailureAnalyzer {
FailureAnalysis analyze(Throwable var1);
}AbstractFailureAnalyzer 抽象類實(shí)現(xiàn) FailureAnalyzer 接口,SpringBoot 已經(jīng)提供一系列 AbstractFailureAnalyzer 繼承類,在 org.springframework.boot.diagnostics.analyzer和org.springframework.boot.autoconfigure.diagnostics.analyzer包下面
- BeanCurrentlyInCreationFailureAnalyzer
- PortInUseFailureAnalyzer
- NoSuchMethodFailureAnalyzer
- BindFailureAnalyzer
- AbstractInjectionFailureAnalyzer
- NoSuchBeanDefinitionFailureAnalyzer
- DataSourceBeanCreationFailureAnalyzer
- HikariDriverConfigurationFailureAnalyzer
- NoUniqueBeanDefinitionFailureAnalyzer
- ValidationExceptionFailureAnalyzer
- ConnectorStartFailureAnalyzer
- CompatibilityNotMetFailureAnalyzer
- BeanNotOfRequiredTypeFailureAnalyzer
隨著Spring Boot版本的提升,實(shí)現(xiàn)類有所新增。
注冊(cè)啟動(dòng)異常分析
上面只是編寫指定異常啟動(dòng)分析,接下來(lái)需要讓它生效,這個(gè)生效方式比較特殊,類似于自定義SpringBoot Starter AutoConfiguration的形式,然后每個(gè)FailureAnalyzer都需要配置在META-INF/spring.factories文件中,如:
# Failure analyzers org.springframework.boot.diagnostics.FailureAnalyzer=\ org.springframework.boot.autoconfigure.diagnostics.analyzer.NoSuchBeanDefinitionFailureAnalyzer,\ org.springframework.boot.autoconfigure.jdbc.DataSourceBeanCreationFailureAnalyzer,\ org.springframework.boot.autoconfigure.jdbc.HikariDriverConfigurationFailureAnalyzer
那我們?yōu)槭裁葱枰褂眠@種方式定義呢? 項(xiàng)目啟動(dòng)遇到的異常順序不能確定,很可能在Spring IOC并未執(zhí)行初始化之前就出現(xiàn)了異常,我們不能通過(guò)@Component注解的形式使其生效,所以SpringBoot提供了通過(guò)spring.factories配置文件的方式定義。
通過(guò)FailureAnalyzer接口攔截獲取到啟動(dòng)時(shí)異常,然后呢,有啥用?不難發(fā)現(xiàn),在同一個(gè)包路徑下面存在FailureAnalysisReporter接口:
public interface FailureAnalysisReporter {
void report(FailureAnalysis var1);
}接口實(shí)現(xiàn)類,有所刪減:
@NoArgsConstructor
public final class LoggingFailureAnalysisReporter implements FailureAnalysisReporter {
public void report(FailureAnalysis failureAnalysis) {
logger.debug("Application failed to start due to an exception", failureAnalysis.getCause());
logger.error(this.buildMessage(failureAnalysis));
}
private String buildMessage(FailureAnalysis failureAnalysis) {
StringBuilder builder = new StringBuilder();
builder.append(String.format("%n%n"));
builder.append(String.format("***************************%n"));
builder.append(String.format("APPLICATION FAILED TO START%n"));
builder.append(String.format("***************************%n%n"));
builder.append(String.format("Description:%n%n"));
builder.append(String.format("%s%n", failureAnalysis.getDescription()));
if (StringUtils.hasText(failureAnalysis.getAction())) {
builder.append(String.format("%nAction:%n%n"));
builder.append(String.format("%s%n", failureAnalysis.getAction()));
}
return builder.toString();
}
}到次,發(fā)現(xiàn)熟悉的控制臺(tái)輸出:APPLICATION FAILED TO START
使用
自定義類 CustomFailedAnalyzer 實(shí)現(xiàn)接口 FailureAnalyzer,重寫方法 FailureAnalysis analyze(Throwable failure);
配置文件spring.factories放置在resources/META-INF org.springframework.boot.diagnostics.FailureAnalyzer=com.awesome.CustomFailedAnalyzer
到此這篇關(guān)于SpringBoot中FailureAnalyzer的使用詳解的文章就介紹到這了,更多相關(guān)FailureAnalyzer的使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Boot如何通過(guò)CORS處理跨域問(wèn)題
這篇文章主要介紹了Spring Boot如何通過(guò)CORS處理跨域問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04
Java并發(fā)編程之ConcurrentLinkedQueue解讀
這篇文章主要介紹了Java并發(fā)編程之ConcurrentLinkedQueue解讀,非阻塞的實(shí)現(xiàn)方式則可以使用循環(huán)CAS的方式來(lái)實(shí)現(xiàn),而ConcurrentLinkedQueue就是juc包中自帶的經(jīng)典非堵塞方式實(shí)現(xiàn)的工具類,需要的朋友可以參考下2023-12-12
Java 數(shù)據(jù)結(jié)構(gòu)之堆的概念與應(yīng)用
堆是一顆完全二叉樹(shù),在這棵樹(shù)中,所有父節(jié)點(diǎn)都滿足大于等于其子節(jié)點(diǎn)的堆叫大根堆,所有父節(jié)點(diǎn)都滿足小于等于其子節(jié)點(diǎn)的堆叫小根堆,堆雖然是一顆樹(shù),但是通常存放在一個(gè)數(shù)組中,父節(jié)點(diǎn)和孩子節(jié)點(diǎn)的父子關(guān)系通過(guò)數(shù)組下標(biāo)來(lái)確定2021-10-10
SpringBoot項(xiàng)目中分頁(yè)插件PageHelper無(wú)效的問(wèn)題及解決方法
這篇文章主要介紹了解決SpringBoot項(xiàng)目中分頁(yè)插件PageHelper無(wú)效的問(wèn)題,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06
集合嵌套之ArrayList嵌套ArrayList實(shí)例
下面小編就為大家?guī)?lái)一篇集合嵌套之ArrayList嵌套ArrayList實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-08

