在本机进行 Spring Boot 项目开发时,如果启动时出现异常,可以在控制台中明确得知异常相关信息然后进行处理.但在远程的测试、生产服务器中,一般是后台启动或者通过 CI 启动项目,无法直接查看控制台中输出的日志信息. 此时如果启动过程中出现异常我们无法及时得知
但是通过 Spring Boot 文档可知, 可以通过监听 ApplicationFailedEvent
事件进行启动异常处理
6 . An
ApplicationFailedEvent
is sent if there is an exception on startup.
现在我们希望在出现这些异常时, 发送一封邮件到我预定义的邮箱中
创建邮件工具类
发送邮件我们使用 spring-boot-starter-mail
提供的 JavaMailSender
接口, 通过配置 spring.mail
系列参数 Spring Boot 会自动创建 JavaMailSender
但是可能存在发生异常时 JavaMailSender
还没有创建,所以最好是由我们手动创建 JavaMailSender
对象
以下是发送邮件工具类 EmailUtils
1 | package com.github.ghthou.startexceptionnotifications.samples.util; |
创建启动异常监听器
然后创建一个 Spring 监听器 StartExceptionNotificationsListener
,监听启动异常, 然后判断当前环境,如果不是 dev
环境,进行异常通知
1 | package com.github.ghthou.startexceptionnotifications.samples.listener; |
测试
配置自动注册 StartExceptionNotificationsListener
在 resources/META-INF/spring.factories
中进行以下配置
1 | org.springframework.context.ApplicationListener=\ |
创建用于模拟启动过程中出现异常的启动监听器 ApplicationStartingEventListener
,ApplicationEnvironmentPreparedEventListener
等
然后在 SpringApplication
手动添加这些事件
1 | package com.github.ghthou.startexceptionnotifications.samples; |
测试结果
最后通过测试结果可知
- ApplicationStartingEvent
- ApplicationEnvironmentPreparedEvent
- ApplicationPreparedEvent
- ApplicationStartedEvent
- ApplicationReadyEvent
三个事件会进行 ApplicationFailedEvent
事件处理, 不过 ApplicationStartingEvent
事件一般不会产生异常, 而 ApplicationReadyEvent
是启动完成后触发的事件
拓展
目前是使用 email 通知, 如果希望使用 短信,微信,钉钉 通知的话, 在 StartExceptionNotificationsListener
中自定义通知处理即可