美文网首页
Spring Boot 启动失败分析报告

Spring Boot 启动失败分析报告

作者: 尚水杨 | 来源:发表于2020-08-04 10:19 被阅读0次

当启动Spring boot时,注册的FailureAnalyzers可以分析异常信息并提供修复问行动。
下面以启动8080端口被占用的问题来演示一下这个机制。

2020-08-04 09:54:16.256 >>> [main] >>> DEBUG >>> o.s.b.diagnostics.LoggingFailureAnalysisReporter >>> Application failed to start due to an exception
org.springframework.boot.web.server.PortInUseException: Port 8080 is already in use
    at org.springframework.boot.web.server.PortInUseException.lambda$throwIfPortBindingException$0(PortInUseException.java:70)
    at org.springframework.boot.web.server.PortInUseException.lambda$ifPortBindingException$1(PortInUseException.java:85)
    at org.springframework.boot.web.server.PortInUseException.ifCausedBy(PortInUseException.java:103)
    at org.springframework.boot.web.server.PortInUseException.ifPortBindingException(PortInUseException.java:82)
    at org.springframework.boot.web.server.PortInUseException.throwIfPortBindingException(PortInUseException.java:69)
    at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.start(TomcatWebServer.java:228)
    at org.springframework.boot.web.servlet.context.WebServerStartStopLifecycle.start(WebServerStartStopLifecycle.java:43)
    at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:182)
    at org.springframework.context.support.DefaultLifecycleProcessor.access$200(DefaultLifecycleProcessor.java:53)
    at org.springframework.context.support.DefaultLifecycleProcessor$LifecycleGroup.start(DefaultLifecycleProcessor.java:360)
    at org.springframework.context.support.DefaultLifecycleProcessor.startBeans(DefaultLifecycleProcessor.java:158)
    at org.springframework.context.support.DefaultLifecycleProcessor.onRefresh(DefaultLifecycleProcessor.java:122)
    at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:895)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:554)
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:143)
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:758)
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:750)
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:315)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1237)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1226)
    at org.ysy.study.springboot.SpringbootApplication2.main(SpringbootApplication2.java:10)
Caused by: java.lang.IllegalArgumentException: standardService.connector.startFailed
    at org.apache.catalina.core.StandardService.addConnector(StandardService.java:231)
    at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.addPreviouslyRemovedConnectors(TomcatWebServer.java:282)
    at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.start(TomcatWebServer.java:213)
    ... 16 common frames omitted
Caused by: org.apache.catalina.LifecycleException: Protocol handler start failed
    at org.apache.catalina.connector.Connector.startInternal(Connector.java:1067)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
    at org.apache.catalina.core.StandardService.addConnector(StandardService.java:227)
    ... 18 common frames omitted
Caused by: java.net.BindException: Address already in use: bind
    at sun.nio.ch.Net.bind0(Native Method)
    at sun.nio.ch.Net.bind(Net.java:433)
    at sun.nio.ch.Net.bind(Net.java:425)
    at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:220)
    at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:85)
    at org.apache.tomcat.util.net.NioEndpoint.initServerSocket(NioEndpoint.java:228)
    at org.apache.tomcat.util.net.NioEndpoint.bind(NioEndpoint.java:211)
    at org.apache.tomcat.util.net.AbstractEndpoint.bindWithCleanup(AbstractEndpoint.java:1141)
    at org.apache.tomcat.util.net.AbstractEndpoint.start(AbstractEndpoint.java:1227)
    at org.apache.coyote.AbstractProtocol.start(AbstractProtocol.java:592)
    at org.apache.catalina.connector.Connector.startInternal(Connector.java:1064)
    ... 20 common frames omitted
Disconnected from the target VM, address: '127.0.0.1:51058', transport: 'socket'
2020-08-04 09:54:16.271 >>> [main] >>> ERROR >>> o.s.b.diagnostics.LoggingFailureAnalysisReporter >>> 

***************************
APPLICATION FAILED TO START
***************************

Description:

Web server failed to start. Port 8080 was already in use.

Action:

Identify and stop the process that's listening on port 8080 or configure this application to listen on another port.


Process finished with exit code 1

这里面有两个比较重要的东西,一个是分析异常,一个是报告异常信息

分析异常

a.png

报告异常信息

r.png

如何自定义FailureAnalyzer

  1. 继承org.springframework.boot.diagnostics.AbstractFailureAnalyzer
  2. 将实现类配置到META-INF/spring.factories
org.springframework.boot.diagnostics.FailureAnalyzer=org.ysy.study.springboot.startup.DemoFailureAnalyzer

DemoFailureAnalyzer

package org.ysy.study.springboot.startup;

import org.springframework.boot.diagnostics.AbstractFailureAnalyzer;
import org.springframework.boot.diagnostics.FailureAnalysis;

public class DemoFailureAnalyzer  extends AbstractFailureAnalyzer<DemoException> {
    @Override
    protected FailureAnalysis analyze(Throwable rootFailure, DemoException cause) {
        return new FailureAnalysis("this is demo.",
                "this is demo",
                cause);
    }
}

异常打印

2020-08-04 10:16:53.256 >>> [main] >>> DEBUG >>> o.s.b.diagnostics.LoggingFailureAnalysisReporter >>> Application failed to start due to an exception
org.ysy.study.springboot.startup.DemoException: demo exception
    at org.ysy.study.springboot.startup.DemoBean.init(DemoBean.java:15)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleElement.invoke(InitDestroyAnnotationBeanPostProcessor.java:389)
    at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleMetadata.invokeInitMethods(InitDestroyAnnotationBeanPostProcessor.java:333)
    at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:157)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:416)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1788)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:595)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517)
    at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:323)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:226)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:893)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:879)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:551)
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:143)
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:758)
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:750)
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:315)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1237)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1226)
    at org.ysy.study.springboot.SpringbootApplication2.main(SpringbootApplication2.java:10)
2020-08-04 10:16:53.256 >>> [main] >>> ERROR >>> o.s.b.diagnostics.LoggingFailureAnalysisReporter >>> 

***************************
APPLICATION FAILED TO START
***************************

Description:

this is demo.

Action:

this is demo


Process finished with exit code 1

相关文章

网友评论

      本文标题:Spring Boot 启动失败分析报告

      本文链接:https://www.haomeiwen.com/subject/gmiirktx.html