良好的伺服器端軟體必須擁有完善的生命週期管理,確保啟動、運行、暫停、恢復、銷毀各階段資源正確獲取與釋放。本文展示一套可擴充的生命週期框架,包含狀態機、監聽器模式、骨架實作與預設實作,並以 Socket 伺服器為例示範。
public enum LifecycleState {
NEW, INITIALIZING, INITIALIZED,
STARTING, STARTED,
SUSPENDING, SUSPENDED,
RESUMING, RESUMED,
DESTROYING, DESTROYED,
FAILED
}
任意狀態轉換失敗均進入 FAILED。
public interface ILifecycle {
void init() throws LifecycleException;
void start() throws LifecycleException;
void suspend() throws LifecycleException;
void resume() throws LifecycleException;
void destroy() throws LifecycleException;
void addLifecycleListener(ILifecycleListener listener);
void removeLifecycleListener(ILifecycleListener listener);
}
public interface ILifecycleListener {
void lifecycleEvent(LifecycleEvent event);
}
public final class LifecycleEvent {
private final LifecycleState state;
public LifecycleEvent(LifecycleState state) { this.state = state; }
public LifecycleState getState() { return state; }
}
封裝通用邏輯:狀態合法性檢查、狀態變更、事件觸發、異常處理與監聽器管理。採用模板方法模式,將具體動作延遲到受保護的抽象方法 init0()、start0() 等。
public abstract class AbstractLifecycle implements ILifecycle {
private final List<ILifecycleListener> listeners = new CopyOnWriteArrayList<>();
private LifecycleState state = LifecycleState.NEW;
@Override public final synchronized void init() throws LifecycleException {
if (state != LifecycleState.NEW) return;
setStateAndFire(LifecycleState.INITIALIZING);
try { init0(); }
catch (Throwable t) { handleFailure(t); }
setStateAndFire(LifecycleState.INITIALIZED);
}
// start(), suspend(), resume(), destroy() 結構類似
protected abstract void init0() throws LifecycleException;
protected abstract void start0() throws LifecycleException;
protected abstract void suspend0() throws LifecycleException;
protected abstract void resume0() throws LifecycleException;
protected abstract void destroy0() throws LifecycleException;
private void setStateAndFire(LifecycleState newState) {
state = newState;
fireLifecycleEvent(new LifecycleEvent(state));
}
private void fireLifecycleEvent(LifecycleEvent event) {
for (ILifecycleListener l : listeners) l.lifecycleEvent(event);
}
// 監聽器增刪、getState、toString 等略
}
提供所有抽象方法的空實作,讓具體類僅覆寫關心的階段:
public class DefaultLifecycle extends AbstractLifecycle {
@Override protected void init0() {}
@Override protected void start0() {}
@Override protected void suspend0() {}
@Override protected void resume0() {}
@Override protected void destroy0() {}
}
public class SocketServer extends DefaultLifecycle {
private ServerSocket acceptor;
private final int port = 9527;
@Override protected void init0() throws LifecycleException {
try { acceptor = new ServerSocket(port); }
catch (IOException e) { throw new LifecycleException(e); }
}
@Override protected void start0() throws LifecycleException {
try {
Socket socket = acceptor.accept(); // 阻塞等待連線
// 處理 socket...
} catch (IOException e) { throw new LifecycleException(e); }
}
@Override protected void destroy0() throws LifecycleException {
if (acceptor != null) try { acceptor.close(); } catch (IOException ignored) {}
}
}
啟動流程:server.init(); server.start(); 關閉:server.destroy(); 所有資源釋放由框架保證。
LifecycleException 統一異常類型,攜帶原始異常與格式化訊息。LifecycleManager 統一管理多組件的啟停順序與依賴關係。這套機制以介面定義契約,骨架類消除樣板碼,預設類提供彈性,監聽器解耦橫切關注點。引入專案後,告別「只有一個 main 印關閉訊息」的簡陋關閉方式,實現生產級的優雅啟停。