⚡ 初始提交 - FutureOSS v1.0 插件化运行时框架
一切皆为插件的开发者工具运行时框架
🧩 核心特性:
- 插件热插拔 (importlib 动态加载)
- 依赖自动解析 (拓扑排序 + 循环检测)
- 企业级稳定 (熔断/降级/重试/隔离)
- 事件驱动 (发布/订阅事件总线)
- 完整配置 (YAML 配置 + 热重载)
This commit is contained in:
150
store/@{FutureOSS}/lifecycle/main.py
Normal file
150
store/@{FutureOSS}/lifecycle/main.py
Normal file
@@ -0,0 +1,150 @@
|
||||
"""生命周期插件 - 管理插件生命周期状态"""
|
||||
from enum import Enum
|
||||
from typing import Optional, Callable, Any
|
||||
|
||||
from oss.plugin.types import Plugin, register_plugin_type
|
||||
|
||||
|
||||
class LifecycleState(str, Enum):
|
||||
"""生命周期状态"""
|
||||
PENDING = "pending"
|
||||
RUNNING = "running"
|
||||
STOPPED = "stopped"
|
||||
|
||||
|
||||
class LifecycleError(Exception):
|
||||
"""生命周期错误"""
|
||||
pass
|
||||
|
||||
|
||||
class Lifecycle:
|
||||
"""生命周期管理器"""
|
||||
|
||||
VALID_TRANSITIONS = {
|
||||
LifecycleState.PENDING: [LifecycleState.RUNNING],
|
||||
LifecycleState.RUNNING: [LifecycleState.STOPPED],
|
||||
LifecycleState.STOPPED: [LifecycleState.RUNNING],
|
||||
}
|
||||
|
||||
def __init__(self, name: str):
|
||||
self.name = name
|
||||
self.state = LifecycleState.PENDING
|
||||
self._hooks: dict[str, list[Callable]] = {
|
||||
"before_start": [],
|
||||
"after_start": [],
|
||||
"before_stop": [],
|
||||
"after_stop": [],
|
||||
}
|
||||
self._extensions: dict[str, Any] = {} # 扩展能力
|
||||
|
||||
def add_extension(self, name: str, extension: Any):
|
||||
"""添加扩展能力"""
|
||||
self._extensions[name] = extension
|
||||
|
||||
def get_extension(self, name: str) -> Optional[Any]:
|
||||
"""获取扩展能力"""
|
||||
return self._extensions.get(name)
|
||||
|
||||
def transition(self, target_state: LifecycleState):
|
||||
"""状态转换"""
|
||||
if target_state not in self.VALID_TRANSITIONS.get(self.state, []):
|
||||
raise LifecycleError(
|
||||
f"插件 '{self.name}' 无法从 {self.state.value} 转换到 {target_state.value}"
|
||||
)
|
||||
|
||||
old_state = self.state
|
||||
self.state = target_state
|
||||
|
||||
def start(self):
|
||||
"""启动"""
|
||||
for hook in self._hooks["before_start"]:
|
||||
hook(self)
|
||||
self.transition(LifecycleState.RUNNING)
|
||||
for hook in self._hooks["after_start"]:
|
||||
hook(self)
|
||||
|
||||
def stop(self):
|
||||
"""停止"""
|
||||
for hook in self._hooks["before_stop"]:
|
||||
hook(self)
|
||||
self.transition(LifecycleState.STOPPED)
|
||||
for hook in self._hooks["after_stop"]:
|
||||
hook(self)
|
||||
|
||||
def restart(self):
|
||||
"""重启"""
|
||||
if self.state == LifecycleState.RUNNING:
|
||||
self.stop()
|
||||
self.start()
|
||||
|
||||
def on(self, event: str, hook: Callable):
|
||||
"""注册钩子"""
|
||||
if event in self._hooks:
|
||||
self._hooks[event].append(hook)
|
||||
|
||||
def is_running(self) -> bool:
|
||||
return self.state == LifecycleState.RUNNING
|
||||
|
||||
def is_stopped(self) -> bool:
|
||||
return self.state == LifecycleState.STOPPED
|
||||
|
||||
def is_pending(self) -> bool:
|
||||
return self.state == LifecycleState.PENDING
|
||||
|
||||
def __repr__(self):
|
||||
return f"Lifecycle({self.name}, state={self.state.value})"
|
||||
|
||||
|
||||
class LifecyclePlugin(Plugin):
|
||||
"""生命周期插件"""
|
||||
|
||||
def __init__(self):
|
||||
self.lifecycles: dict[str, Lifecycle] = {}
|
||||
|
||||
def init(self, deps: dict = None):
|
||||
"""初始化"""
|
||||
pass
|
||||
|
||||
def start(self):
|
||||
"""启动"""
|
||||
pass
|
||||
|
||||
def stop(self):
|
||||
"""停止"""
|
||||
pass
|
||||
|
||||
def create(self, name: str) -> Lifecycle:
|
||||
"""创建生命周期"""
|
||||
lifecycle = Lifecycle(name)
|
||||
self.lifecycles[name] = lifecycle
|
||||
return lifecycle
|
||||
|
||||
def get(self, name: str) -> Optional[Lifecycle]:
|
||||
"""获取生命周期"""
|
||||
return self.lifecycles.get(name)
|
||||
|
||||
def start_all(self):
|
||||
"""启动所有"""
|
||||
for lc in self.lifecycles.values():
|
||||
try:
|
||||
lc.start()
|
||||
except LifecycleError:
|
||||
pass
|
||||
|
||||
def stop_all(self):
|
||||
"""停止所有"""
|
||||
for lc in self.lifecycles.values():
|
||||
try:
|
||||
lc.stop()
|
||||
except LifecycleError:
|
||||
pass
|
||||
|
||||
|
||||
# 注册类型
|
||||
register_plugin_type("Lifecycle", Lifecycle)
|
||||
register_plugin_type("LifecycleState", LifecycleState)
|
||||
register_plugin_type("LifecycleError", LifecycleError)
|
||||
|
||||
|
||||
def New():
|
||||
return LifecyclePlugin()
|
||||
Reference in New Issue
Block a user