插件状态管理未生效,导致状态不正常。
This commit is contained in:
@@ -78,8 +78,11 @@ class PluginManager:
|
||||
|
||||
for plugin_name in plugin_modules:
|
||||
try:
|
||||
if self.load_plugin(plugin_name):
|
||||
plugin = self.load_plugin(plugin_name)
|
||||
if plugin:
|
||||
loaded_plugins.append(plugin_name)
|
||||
# 自动启动插件
|
||||
self.start_plugin(plugin.name)
|
||||
except Exception as e:
|
||||
self.LOG.error(f"PluginManager:加载插件 {plugin_name} 时发生错误: {str(e)}", exc_info=True)
|
||||
|
||||
@@ -215,31 +218,72 @@ class PluginManager:
|
||||
if plugin_name not in self.plugins:
|
||||
self.LOG.info(f"PluginManager:插件 {plugin_name} 未加载")
|
||||
return False
|
||||
|
||||
|
||||
plugin = self.plugins[plugin_name]
|
||||
|
||||
|
||||
# 停止插件
|
||||
if plugin.status == PluginStatus.RUNNING:
|
||||
if not plugin.stop():
|
||||
self.LOG.info(f"PluginManager:停止插件 {plugin_name} 失败")
|
||||
return False
|
||||
|
||||
plugin.status = PluginStatus.STOPPED # 确保状态更新
|
||||
|
||||
# 清理插件资源
|
||||
if not plugin.cleanup():
|
||||
self.LOG.info(f"PluginManager:清理插件 {plugin_name} 资源失败")
|
||||
return False
|
||||
|
||||
|
||||
# 设置状态为未加载
|
||||
plugin.status = PluginStatus.UNLOADED
|
||||
|
||||
# 注销插件
|
||||
PluginRegistry().unregister(plugin_name)
|
||||
|
||||
|
||||
# 移除插件实例
|
||||
del self.plugins[plugin_name]
|
||||
|
||||
|
||||
# 发布插件卸载事件
|
||||
EventSystem().publish(EventType.PLUGIN_UNLOADED, {"plugin_name": plugin_name})
|
||||
|
||||
|
||||
return True
|
||||
|
||||
def reload_plugin(self, plugin_name: str) -> Optional[PluginInterface]:
|
||||
"""
|
||||
重新加载插件
|
||||
|
||||
Args:
|
||||
plugin_name: 插件名称
|
||||
|
||||
Returns:
|
||||
插件实例,重新加载失败返回None
|
||||
"""
|
||||
# 记录原插件状态
|
||||
was_running = False
|
||||
if plugin_name in self.plugins:
|
||||
was_running = self.plugins[plugin_name].status == PluginStatus.RUNNING
|
||||
|
||||
# 卸载插件
|
||||
if not self.unload_plugin(plugin_name):
|
||||
self.LOG.info(f"卸载插件 {plugin_name} 失败")
|
||||
return None
|
||||
|
||||
# 重新导入模块
|
||||
if plugin_name in self.plugin_modules:
|
||||
try:
|
||||
importlib.reload(self.plugin_modules[plugin_name])
|
||||
except Exception as e:
|
||||
self.LOG.info(f"重新导入插件模块 {plugin_name} 失败: {e}")
|
||||
return None
|
||||
|
||||
# 加载插件
|
||||
plugin = self.load_plugin(plugin_name)
|
||||
|
||||
# 如果原来是运行状态,则重新启动
|
||||
if plugin and was_running:
|
||||
self.start_plugin(plugin.name)
|
||||
|
||||
return plugin
|
||||
|
||||
def start_plugin(self, plugin_name: str) -> bool:
|
||||
"""
|
||||
启动插件
|
||||
|
||||
Reference in New Issue
Block a user