Ice (Internet Communications Engine) 是一款高性能的 RPC 中間件,核心優勢在於:
傳統 Ice::initialize() 手動管理通信器生命周期,需編寫大量 try-catch、destroy、waitForShutdown 樣板代碼(文中列舉約 70 行),不僅繁瑣,還干擾業務邏輯閱讀。
Ice::Service — 系統級服務封裝Ice::Service 是單例類,封裝了通信器創建、異常處理、平台相關的服務安裝/啟動/停止/卸載邏輯,專為 Unix Daemon 或 Windows Service 設計。
Ice::Service 並實現三大虛函數#include <Ice/Ice.h>
#include <Ice/Service.h> // 關鍵頭文件,易漏掉!
#include <iostream>
class MyService : public Ice::Service {
protected:
// 服務啟動邏輯:初始化 Adapter、註冊 Servant
virtual bool start(int argc, char* argv[], int& status) override {
std::string endpoint = "tcp -h localhost -p 10000";
// communicator() 由基類提供,無需手動 initialize
m_adapter = communicator()->createObjectAdapterWithEndpoints(
"SimpleHelloAdapter", endpoint);
Ice::ObjectPtr object = new HelloICEI; // 業務實現類
m_adapter->add(object, communicator()->stringToIdentity("SimpleHello"));
m_adapter->activate();
return true; // 返回 false 表示啟動失敗
}
// 服務停止邏輯:清理資源
virtual bool stop() override {
std::cout << "Stop running..." << std::endl;
if (m_adapter) m_adapter->deactivate();
return true;
}
// 處理中斷信號 (Ctrl+C / Service Stop)
virtual void interrupt() override {
std::cout << "Receive signal, shutting down..." << std::endl;
Ice::Service::interrupt(); // 調用基類觸發 shutdown 流程
}
private:
Ice::ObjectAdapterPtr m_adapter;
};
main 入口int main(int argc, char* argv[]) {
MyService svc;
// main 接管命令行參數分發:--install, --start, --stop, --service 等
return svc.main(argc, argv, "config.service"); // 可選配置文件
}
編譯生成 MyService.exe 後,通過命令行參數控制服務生命周期:
| 命令 | 作用 | 示例 |
|---|---|---|
--install NAME [--display DISP] [--executable PATH] | 安裝為 Windows 服務 | MyService.exe --install MyIceService --display "Ice Demo" |
--uninstall NAME | 移除服務 (需先停止) | MyService.exe --uninstall MyIceService |
--start NAME [ARGS...] | 啟動服務 | MyService.exe --start MyIceService |
--stop NAME | 停止服務 | MyService.exe --stop MyIceService |
--service NAME | 以服務身份運行 (SCM 自動調用) | 無需手動執行 |
Visual Studio 調試技巧:項目屬性 → Debugging → Command Arguments 填入 --install MyService,按 F5 即可一鍵安裝註冊;後續改為 --service MyService 以服務模式調試。
<Ice/Service.h>,而非 <Ice/Ice.h>,否則找不到類定義。Ice::Service 派生類實例;若需多通信器,需手動 Ice::initialize()。main() 最後一個參數可指定配置文件 (如 config.service),集中管理端點、線程池、插件等屬性。Ice::Service 將「基礎設施代碼」降維為「配置聲明」,讓開發者專注於 start() 中的業務邏輯。結合 IceGrid 進行集群部署,即可構建生產級高可用分布式系統。