首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Spring 應用常駐記憶體:異常自動恢復與持續運行架構

     編輯:Java 相關知識

業務場景

後台批次處理程式(Spring + iBatis),需 7×24 小時無人值守運行。網路抖動、資料庫重啟、配置變更等暫時性故障不得導致進程退出,故障排除後需自動恢復處理。

核心實現:無限迴圈 + 異常捕獲 + 重新初始化

public static void main(String[] args) {
    while (true) {
        try {
            // 1. 獲取/重建 Spring 容器
            ApplicationContext ctx = ApplicationContextUtil.getApplicationContext();
            // 2. 取得核心任務 Bean
            IssuePlan issuePlan = (IssuePlan) ctx.getBean("issuePlan");
            // 3. 執行任務(內部含 while(true) 迴圈,正常不退出)
            issuePlan.execute();
        } catch (Throwable e) { // 捕獲 Error 含 OOM、StackOverflow 等嚴重錯誤
            log.error("網路視頻節目分發程式啟動發生嚴重錯誤!", e);
            // 4. 等待冷卻後重試
            try { Thread.sleep(PAUSE_TIMESPAN * 1000L); }
            catch (InterruptedException ignored) {}
        }
    }
}

關鍵設計解析

環節作用注意事項
while(true) 外層迴圈進程守護,確保主線程永不結束需配合 nohup、& 後台運行
重新獲取 ApplicationContext故障後重建 Spring 容器,刷新資料庫連線池、配置屬性舊容器需正確關閉(註冊 shutdown hook)避免資源洩漏
issuePlan.execute() 內部迴圈核心業務邏輯,正常情況無限運行僅在「嚴重錯誤」拋出異常時退出,觸發外層重試
捕獲 Throwable攔截 Exception 之外的 Error(如 OOM),最後防線謹慎使用,避免掩蓋應快速失效的程式錯誤
Thread.sleep 退避避免故障高頻重試佔滿 CPU/日誌可引入指數退避策略

生產環境強化建議

  • 健康檢查端點:暴露 HTTP 端點供監控系統探活(Spring Boot Actuator / 自製 Servlet)。
  • 優雅關閉:註冊 Runtime.getRuntime().addShutdownHook() 關閉資源、持久化狀態。
  • 外部監控:結合 systemd、Supervisor、Kubernetes liveness probe 實現進程級守護,比單純 Java 迴圈更可靠。
  • 錯誤分級:區分「暫時性故障」(網路超時)與「邏輯 Bug」(空指針),後者應告警人工介入而非無限重試。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved