java-服務下線時需要執行方法, 如斷開數據庫連接,zk連接…
1. 實現DisposableBean接口
說明: 實現DisposableBean接口, destroy方法就是服務關閉執行的方法
- 配置關閉服務執行方法:
package com.xhga.config; import org.springframework.beans.factory.DisposableBean; import org.springframework.stereotype.Component; @Component public class ShutdownListener implements DisposableBean { @Override public void destroy() { System.out.println("服務下線 !!!"); } }
- 服務關閉方式: kill -15 pid
說明: 如:kill -9 pid 直接殺死服務, 將不會執行服務下線方法
2. 新增@PreDestroy註解方法
說明: 新增@PreDestory註解方法,並加載到spring容器
-
配置關閉服務執行方法:
package com.xhga.config; import org.springframework.beans.factory.DisposableBean; import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; import javax.annotation.Resource; @Component public class ShutdownListener{ @PreDestroy public void destroyPre(){ System.out.println("服務下線 PreDestroy"); } }
-
服務關閉方式: kill -15 pid
3. springboot引入依賴spring-boot-starter-actuator 2.x 依賴
說明: 根據springboot提供的actuator依賴對springboot項目的監控系統健康情況的工具, 優雅的關閉服務
-
新增pom依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> <version>2.2.1.RELEASE</version> </dependency>
-
配置application.properties (2.x與1.x是有1區別的, 這裏是2.x的配置)
management.endpoints.web.exposure.include=* management.endpoint.shutdown.enabled=true
-
配置關閉服務執行方法
方式1與方式2 任意一種 配置關閉服務執行方法即可 -
服務關閉方式:
發送post請求: http://ip:port/actuator/shutdown 注: 若配置server.servlet.context-path=/api, 則uri需要加上/api 即: http://ip:port/api/actuator/shutdown
案例1 :服務關閉, 立刻刪除本服務創建的zk臨時節點
-
需求場景:
公司項目ZooKeeper做註冊服務中心, 服務上線,創建服務臨時節點, 服務下線時刪除臨時節點, 臨時節點特點就是當客戶端與zk服務端斷開連接,自動刪除此客戶端創建的臨時節點, 由於zk存在sessiontimeout默認30s, 服務關閉時, zk斷開連接並沒有通知zookeeper, 臨時節點不能立刻刪除, 直到sessiontimeout時間時zk服務端發現客戶端已經斷開連接,並刪除臨時節點, 不滿足項目要求, 因爲公司項目調用服務端接口時判斷服務是否在線, 若不在線將不再請求… -
解決方法:
執行服務關閉方法時, 主動斷開zk連接 zk.close(), zk服務端知道客戶端斷開連接, 即可直接刪除此客戶端創建的臨時節點, 調用服務接口時可以及時知道該服務是否在線… -
示例代碼:
package com.xhga.config; import org.apache.zookeeper.ZooKeeper; import org.springframework.beans.factory.DisposableBean; import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; import javax.annotation.Resource; @Component public class DisposableBeanService implements DisposableBean { @Resource private ZooKeeper zk; @PreDestroy public void destroyPre(){ System.out.println("方式1 - 服務下線 PreDestroy!!!"); } @Override public void destroy() { System.out.println("方式2 - 服務下線 DisposableBean!!!"); try { if (zk == null) { return; } zk.close(); System.out.println("服務下線- 關閉zk連接成功"); } catch (InterruptedException e) { System.out.println("服務下線- 關閉zk連接異常"); e.printStackTrace(); } } }
😀若有不正確之處請多多指教,謝謝😋