SpringBoot 사용자 정의 FailureAnalyzer 프로 세 스 분석
8721 단어 springboot사용자 정의failureanalyzer
홈 페이지 설명
1.1 자신의 Failure Analyzer 만 들 기
Failure Analyzer 는 시작 할 때 exception 을 차단 하고 human-readable 메시지 로 변환 하 는 좋 은 방법 으로 고장 분석 에 포함 된다.Spring Boot 는 application context 와 관련 된 exceptions,JSR-303 검증 등에 이러한 분석 기 를 제공 합 니 다.실제로 자신 을 만 들 기 쉽다.
AbstractFailure Analyzer 는 Failure Analyzer 의 편리 한 확장 입 니 다.exception 에 지정 한 exception 형식 이 있 는 지 확인 합 니 다.그 중에서 확장 할 수 있 습 니 다.그러면 implementation 은 실제 존재 할 때 만 exception 을 처리 할 수 있 습 니 다.만약 어떤 이유 로 exception 을 처리 할 수 없다 면,return null 은 다른 implementation 에 exception 을 처리 할 기 회 를 줍 니 다.
FailureAnalyzer __mplement 은 META-INF/spring.factories 에 등 록 됩 니 다.다음 레지스터 ProjectConstraint ViolationFailure Analyzer:
org.springframework.boot.diagnostics.FailureAnalyzer=\
com.example.ProjectConstraintViolationFailureAnalyzer
1.2 고장 제거 auto-configurationSpring Boot auto-configuration 은 최선 을 다 하지만 때로는 일이 실패 할 수도 있 고 원인 을 말 하기 도 어렵다.
Spring Boot Application Context 에 매우 유용 한 Condition EvaluationReport 가 있 습 니 다.DEBUG logging 출력 을 사용 하면 볼 수 있 습 니 다.spring-boot-actuator 를 사용 하면 터미널 이 하나 더 있 습 니 다.JSON 으로 보고 서 를 보 여 줍 니 다.애플 리 케 이 션 을 디 버 깅 하고 Spring Boot 가 실 행 될 때 어떤 features(그리고 없 는 것)를 추 가 했 는 지 확인 합 니 다.
source code 와 자바 doc 를 보면 더 많은 질문 에 대답 할 수 있 습 니 다.일부 경험 법칙:
SpringApplication 은 ApplicationListeners 와 ApplicationContextInitializers 를 가지 고 있 으 며,사용자 정의 컨 텍스트 나 환경 에 사용 할 수 있 습 니 다.Spring Boot 는 META-INF/spring.factories 내부 에서 사용 할 수 있 도록 사용자 정의 항목 을 많이 불 러 왔 습 니 다.다른 방법 을 등록 하 는 방법 은 한 가지 가 아니다.
Environment PostProcessor 를 사용 하여 application context 를 새로 고치 기 전에 Environment 를 사용자 정의 할 수 있 습 니 다.모든 implementation 은 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 는 Spring Boot 기본 으로 불 러 오 는 모든 상용 property 원본 을 준비 하 였 습 니 다.따라서 환경 에서 파일 의 위 치 를 가 져 올 수 있다.이 example 는 목록 끝 에 custom-resource property 원본 을 추가 하여 다른 일반적인 위치 에서 정의 하 는 key 우선 순 위 를 지정 합 니 다.사용자 정의 implementation 은 분명히 다른 order 를 정의 할 수 있 습 니 다.@SpringBootApplication 에서@PropertySource 를 사용 하 는 것 이 편리 하고 Environment 에 사용자 정의 자원 을 불 러 오기 쉬 운 것 같 지만,Spring Boot 가 applicationContext 가 새로 고침 되 기 전에 Environment 를 준비 하 는 것 을 추천 하지 않 습 니 다.@PropertySource 를 통 해 정 의 된 모든 key 는 auto-configuration 에 영향 을 주지 않 고 너무 늦게 불 러 옵 니 다.
코드 예제
2.1 지정 이상 분석
SpringBoot 내부 에서 제공 하 는 작 동 이상 분석 은 모두 구체 적 인 이상 유형 을 지정 하여 이 루어 진 것 입 니 다.가장 흔히 볼 수 있 는 오 류 는 포트 번호 가 점용 되 는 것 입 니 다(PortInUseException).SpringBoot 내부 에서 이 이상 한 작 동 분석 을 제공 하지만 우 리 는 이 이상 분석 을 대체 할 수 있 습 니 다.PortInUseException 이상 의 AbstractFailure Analyzer 를 만 들 고 클래스 를 SpringBoot 에 등록 하면 다음 과 같은 사용자 정의 가 가능 합 니 다.
/**
* @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 파일 에서 정 의 를 내 려 야 합 니 다.다음 과 같 습 니 다.
org.springframework.boot.diagnostics.FailureAnalyzer=\
com.topcheer.activiti.analyzer.PortInUseFailureAnalyzer
그럼 우 리 는 왜 이런 방식 으로 정 의 를 내 려 야 합 니까?프로젝트 시작 에 발생 하 는 이상 순 서 는 확인 되 지 않 습 니 다.Spring IOC 가 초기 화 되 기 전에 이상 이 발생 했 을 가능성 이 높 습 니 다.@Component 주해 형식 으로 적용 할 수 없 기 때문에 SpringBoot 는 spring.factories 설정 파일 을 통 해 정 의 를 제공 합 니 다.
테스트:8080 포트 2 개 시작
이상 분석 상속 관계 시작
사용자 정의 실행 이상 은 일반적으로 Runtime Exception 에서 계승 합 니 다.Runtime Exception 의 이상 시작 분석 인 스 턴 스 를 정의 하면 어떤 효과 가 있 습 니까?
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 파일 에 함께 등록 합 니 다.다음 과 같 습 니 다.
org.springframework.boot.diagnostics.FailureAnalyzer=\
com.topcheer.activiti.analyze.PortInUseFailureAnalyzer,\
com.topcheer.activiti.analyze.ProjectBootUnifiedFailureAnalyzer
프로젝트 를 실행 하고 포트 번호 가 이상 하 게 점용 되 었 음 을 테스트 하면 ProjectBootUnified Failure Analyzer 의 analyzer 방법 을 실행 하지 않 고 PortInUseFailure Analyzer 클래스 의 방법 을 계속 실행 한 것 을 발견 할 수 있 습 니 다.그러면 우 리 는 PortInUseFailureAnalyzer 라 는 시작 분석 을 spring.factories 파일 에서 잠시 삭제 하고 프로젝트 를 실행 합 니 다.이 때 는 ProjectBootUnified FailureAnalyzer 류 의 분석 방법 을 실행 하 는 것 을 발견 할 수 있 습 니 다.
총결산
이 장 에서 우 리 는 SpringBoot 가 제공 하 는 작 동 이상 분석 인터페이스 와 기본 추상 적 인 실현 류 의 운영 원 리 를 알 게 되 었 고 이상 분석 을 시작 하면 범 형 이상 류 의 상하 상속 관 계 를 분석 하고 이상 서브 류 의 작 동 분석 은 이상 부모 류 의 작 동 분석 을 덮어 버 릴 것 이다.모든 이상 한 시작 분석 을 포함 하고 싶다 면 Exception 을 AbstractFailure Analyzer 의 일반적인 매개 변수 로 사용 해 보 세 요.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
thymeleaf로 HTML 페이지를 동적으로 만듭니다 (spring + gradle)지난번에는 에서 화면에 HTML을 표시했습니다. 이번에는 화면을 동적으로 움직여보고 싶기 때문에 입력한 문자를 화면에 표시시키고 싶습니다. 초보자의 비망록이므로 이상한 점 등 있으면 지적 받을 수 있으면 기쁩니다! ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.