java-服務摧毀, 服務關閉 優雅退出 並執行摧毀方法,完成某些操作

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項目的監控系統健康情況的工具, 優雅的關閉服務

  1. 新增pom依賴

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
        <version>2.2.1.RELEASE</version>
    </dependency>
    
  2. 配置application.properties (2.x與1.x是有1區別的, 這裏是2.x的配置)

    	management.endpoints.web.exposure.include=*
    	management.endpoint.shutdown.enabled=true
    
  3. 配置關閉服務執行方法
    方式1與方式2 任意一種 配置關閉服務執行方法即可

  4. 服務關閉方式:

     發送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();
            }
        }
    }
    
                            😀若有不正確之處請多多指教,謝謝😋
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章