插件状态管理未生效,导致状态不正常。
This commit is contained in:
@@ -78,8 +78,11 @@ class PluginManager:
|
|||||||
|
|
||||||
for plugin_name in plugin_modules:
|
for plugin_name in plugin_modules:
|
||||||
try:
|
try:
|
||||||
if self.load_plugin(plugin_name):
|
plugin = self.load_plugin(plugin_name)
|
||||||
|
if plugin:
|
||||||
loaded_plugins.append(plugin_name)
|
loaded_plugins.append(plugin_name)
|
||||||
|
# 自动启动插件
|
||||||
|
self.start_plugin(plugin.name)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
self.LOG.error(f"PluginManager:加载插件 {plugin_name} 时发生错误: {str(e)}", exc_info=True)
|
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:
|
if plugin_name not in self.plugins:
|
||||||
self.LOG.info(f"PluginManager:插件 {plugin_name} 未加载")
|
self.LOG.info(f"PluginManager:插件 {plugin_name} 未加载")
|
||||||
return False
|
return False
|
||||||
|
|
||||||
plugin = self.plugins[plugin_name]
|
plugin = self.plugins[plugin_name]
|
||||||
|
|
||||||
# 停止插件
|
# 停止插件
|
||||||
if plugin.status == PluginStatus.RUNNING:
|
if plugin.status == PluginStatus.RUNNING:
|
||||||
if not plugin.stop():
|
if not plugin.stop():
|
||||||
self.LOG.info(f"PluginManager:停止插件 {plugin_name} 失败")
|
self.LOG.info(f"PluginManager:停止插件 {plugin_name} 失败")
|
||||||
return False
|
return False
|
||||||
|
plugin.status = PluginStatus.STOPPED # 确保状态更新
|
||||||
|
|
||||||
# 清理插件资源
|
# 清理插件资源
|
||||||
if not plugin.cleanup():
|
if not plugin.cleanup():
|
||||||
self.LOG.info(f"PluginManager:清理插件 {plugin_name} 资源失败")
|
self.LOG.info(f"PluginManager:清理插件 {plugin_name} 资源失败")
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
# 设置状态为未加载
|
||||||
|
plugin.status = PluginStatus.UNLOADED
|
||||||
|
|
||||||
# 注销插件
|
# 注销插件
|
||||||
PluginRegistry().unregister(plugin_name)
|
PluginRegistry().unregister(plugin_name)
|
||||||
|
|
||||||
# 移除插件实例
|
# 移除插件实例
|
||||||
del self.plugins[plugin_name]
|
del self.plugins[plugin_name]
|
||||||
|
|
||||||
# 发布插件卸载事件
|
# 发布插件卸载事件
|
||||||
EventSystem().publish(EventType.PLUGIN_UNLOADED, {"plugin_name": plugin_name})
|
EventSystem().publish(EventType.PLUGIN_UNLOADED, {"plugin_name": plugin_name})
|
||||||
|
|
||||||
return True
|
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:
|
def start_plugin(self, plugin_name: str) -> bool:
|
||||||
"""
|
"""
|
||||||
启动插件
|
启动插件
|
||||||
|
|||||||
Reference in New Issue
Block a user