管理SpringBoot項目的三個強(qiáng)大的功能是否用過?
環(huán)境:SpringBoot2.7.18
1. 管理功能Admin Features
通過指定spring.application.admin.enabled屬性,可以為應(yīng)用程序啟用管理員相關(guān)的功能。這在平臺MBeanServer上公開了SpringApplicationAdminMXBean。你可以使用這個特性遠(yuǎn)程管理Spring Boot應(yīng)用程序。
spring:
application:
admin:
enabled: true
開啟管理功能后,你可以通過JConsole查看MBean對當(dāng)前的SpringBoot程序進(jìn)行簡單的管理及查看。默認(rèn)JMX的名稱為:org.springframework.boot:type=Admin,name=SpringApplication
圖片
在操作菜單中,我們可以通過shutdown關(guān)閉應(yīng)用程序,可以通過getProperty獲取應(yīng)用中的配置屬性信息。
圖片
獲取屬性信息:
圖片
自定義JMX名稱:
spring:
application:
admin:
enabled: true
jmx-name: com.pack:type=AKF,name=PackAPP
注意:這里jmx-name格式:xxx:type=yyy,name=zzz
圖片
2. 應(yīng)用退出
每個SpringApplication都向JVM注冊一個關(guān)閉掛鉤,以確保ApplicationContext在退出時正常關(guān)閉。所有標(biāo)準(zhǔn)的Spring生命周期回調(diào)(如DisposableBean接口或@PreDestroy注釋)都可以使用。
2.1 自定義退出碼
@Component
@Order(-2)
public class PackExitCodeGenerator implements ExitCodeGenerator {
@Override
public int getExitCode() {
System.out.println("PackExitCodeGenerator exit code 6...") ;
return 6 ;
}
}
你可以定義多個實(shí)現(xiàn)了ExitCodeGenerator的類,通過@Order定義順序,而SpringBoot只會返回第一個非零的退出碼。
SpringBoot的退出操作是調(diào)用當(dāng)前容器ConfigurableApplicationContext#close方法。所以當(dāng)前容器中所有實(shí)現(xiàn)了DisposableBean或使用了@PreDestory注解他們對應(yīng)的回調(diào)方法都執(zhí)行。
2.2 自定義DisposableBean
@Component
public class AppComponent implements DisposableBean {
@Override
public void destroy() throws Exception {
System.out.println("Bean生命周期結(jié)束...") ;
}
}
2.3 定義exit接口
@Resource
private ConfigurableApplicationContext context ;
@GetMapping("")
public Object exit() {
SpringApplication.exit(context) ;
return "exit" ;
}
2.4 測試
調(diào)用上的接口后,你將在控制臺看到如下輸出
圖片
在關(guān)閉應(yīng)用程序之前SpringBoot會發(fā)布ExitCodeEvent事件
@Component
public class PackAppExitListener implements ApplicationListener<ExitCodeEvent> {
@Override
public void onApplicationEvent(ExitCodeEvent event) {
System.out.printf("監(jiān)聽到應(yīng)用退出事件,退出碼:%d%n", event.getExitCode()) ;
}
}
結(jié)果輸出:
圖片
3. 應(yīng)用啟動跟蹤
在應(yīng)用程序啟動期間,SpringApplication和ApplicationContext執(zhí)行許多與應(yīng)用程序生命周期、bean生命周期甚至處理應(yīng)用程序事件相關(guān)的任務(wù)。有了ApplicationStartup, Spring框架允許你用StartupStep對象跟蹤應(yīng)用程序的啟動順序。收集這些數(shù)據(jù)可以用于分析,或者只是為了更好地了解應(yīng)用程序啟動過程。
你可以在設(shè)置SpringApplication實(shí)例時選擇ApplicationStartup實(shí)現(xiàn)。例如,要使用BufferingApplicationStartup,如下示例:
SpringApplication application = new SpringApplication(SpringbootComprehensiveApplication.class) ;
application.setApplicationStartup(new BufferingApplicationStartup(2048)) ;
application.run(args) ;
接下來需要通過可以通過Actuator暴露的端口,以JSON的形式查看信息。引入依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
通過/startup接口查看Spring容器啟動過程的完整信息。
圖片
在你的項目中你還可以注入ApplicationStartup,在自己的業(yè)務(wù)代碼中進(jìn)行監(jiān)控。
@Resource
private ApplicationStartup startup ;
這樣你就可以進(jìn)行start和end方法調(diào)用進(jìn)行記錄監(jiān)控了。