From 0af6d5a7581532b4658160a19680c09ffd427279 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AE=89=E6=B5=A9=E6=B5=A9?= <1036606149@qq.com> Date: Wed, 8 Jan 2025 17:59:32 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90=E5=8A=9F=E8=83=BD=E5=AE=8C=E5=96=84?= =?UTF-8?q?=E3=80=91IoT:=20=E6=96=B0=E5=A2=9E=E6=8F=92=E4=BB=B6=E5=90=AF?= =?UTF-8?q?=E5=8A=A8=E9=80=BB=E8=BE=91=EF=BC=8C=E9=87=8D=E6=9E=84=E6=8F=92?= =?UTF-8?q?=E4=BB=B6=E7=8A=B6=E6=80=81=E7=AE=A1=E7=90=86=EF=BC=8C=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E4=B8=8D=E5=86=8D=E4=BD=BF=E7=94=A8=E7=9A=84=E7=8A=B6?= =?UTF-8?q?=E6=80=81=E6=96=87=E4=BB=B6=E6=9B=B4=E6=96=B0=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...-module-iot-http-plugin-2.2.0-snapshot.jar | Bin 16779 -> 15105 bytes .../admin/plugin/vo/PluginInfoPageReqVO.java | 5 +- .../iot/framework/plugin/PluginStart.java | 51 ++++++++++++++++++ .../plugin/UnifiedConfiguration.java | 8 ++- .../iot/service/plugin/PluginInfoService.java | 5 +- .../service/plugin/PluginInfoServiceImpl.java | 1 - .../service/plugin/PluginInstanceService.java | 8 --- .../plugin/PluginInstanceServiceImpl.java | 46 +--------------- .../module/iot/plugin/HttpVertxPlugin.java | 16 +++++- 9 files changed, 80 insertions(+), 60 deletions(-) create mode 100644 yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/framework/plugin/PluginStart.java diff --git a/plugins/yudao-module-iot-http-plugin-2.2.0-snapshot.jar b/plugins/yudao-module-iot-http-plugin-2.2.0-snapshot.jar index 7193d630d82b0166448c05c7550933db82624dac..fa75769049a1e0036436209788e16c216edd4891 100644 GIT binary patch delta 6325 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 P-~qDX0DuLa=f?j77 { // 1. 忽略租户上下文执行 + List pluginInfoList = pluginInfoService + .getPluginInfoListByStatus(IotPluginStatusEnum.RUNNING.getStatus()); // 2. 获取运行中的插件列表 + if (CollUtil.isEmpty(pluginInfoList)) { // 3. 检查插件列表是否为空 + log.info("[run] 没有需要启动的插件"); // 4. 日志记录没有插件需要启动 + return; + } + pluginInfoList.forEach(pluginInfo -> { // 5. 使用lambda表达式遍历插件列表 + try { + log.info("[run][启动插件] pluginKey = {}", pluginInfo.getPluginKey()); // 6. 日志记录插件启动信息 + pluginManager.startPlugin(pluginInfo.getPluginKey()); // 7. 启动插件 + } catch (Exception e) { + log.error("[run][启动插件失败] pluginKey = {}", pluginInfo.getPluginKey(), e); // 8. 记录启动失败的日志 + } + }); + }); + + } + +} diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/framework/plugin/UnifiedConfiguration.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/framework/plugin/UnifiedConfiguration.java index 4f1d5e3e29..374e3856a1 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/framework/plugin/UnifiedConfiguration.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/framework/plugin/UnifiedConfiguration.java @@ -31,7 +31,13 @@ public class UnifiedConfiguration { @DependsOn(SERVICE_REGISTRY_INITIALIZED_MARKER) public SpringPluginManager pluginManager() { log.info("[init][实例化 SpringPluginManager]"); - SpringPluginManager springPluginManager = new SpringPluginManager(); + SpringPluginManager springPluginManager = new SpringPluginManager() { + @Override + public void startPlugins() { + // 禁用插件启动,避免插件启动时,启动所有插件 + log.info("[init][禁用默认启动所有插件]"); + } + }; springPluginManager.addPluginStateListener(new CustomPluginStateListener()); return springPluginManager; } diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/plugin/PluginInfoService.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/plugin/PluginInfoService.java index 2e920e32cb..3a1529674f 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/plugin/PluginInfoService.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/plugin/PluginInfoService.java @@ -4,6 +4,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.PluginInfoPageReqVO; import cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.PluginInfoSaveReqVO; import cn.iocoder.yudao.module.iot.dal.dataobject.plugininfo.PluginInfoDO; +import cn.iocoder.yudao.module.iot.enums.plugin.IotPluginStatusEnum; import jakarta.validation.Valid; import org.springframework.web.multipart.MultipartFile; @@ -66,7 +67,7 @@ public interface PluginInfoService { * 更新插件的状态 * * @param id 插件id - * @param status 状态 + * @param status 状态 {@link IotPluginStatusEnum} */ void updatePluginStatus(Long id, Integer status); @@ -80,7 +81,7 @@ public interface PluginInfoService { /** * 根据状态获得插件信息列表 * - * @param status 状态 + * @param status 状态 {@link IotPluginStatusEnum} * @return 插件信息列表 */ List getPluginInfoListByStatus(Integer status); diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/plugin/PluginInfoServiceImpl.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/plugin/PluginInfoServiceImpl.java index 8e1fae88ab..4cf922c20b 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/plugin/PluginInfoServiceImpl.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/plugin/PluginInfoServiceImpl.java @@ -102,7 +102,6 @@ public class PluginInfoServiceImpl implements PluginInfoService { // 3 上传新的插件文件,更新插件启用状态文件 String pluginKeyNew = pluginInstanceService.uploadAndLoadNewPlugin(file); - pluginInstanceService.updatePluginStatusFile(pluginKeyNew, false); // 4. 更新插件信息 updatePluginInfo(pluginInfoDo, pluginKeyNew, file); diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/plugin/PluginInstanceService.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/plugin/PluginInstanceService.java index cd1d5a6547..9c360606a8 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/plugin/PluginInstanceService.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/plugin/PluginInstanceService.java @@ -37,14 +37,6 @@ public interface PluginInstanceService { */ String uploadAndLoadNewPlugin(MultipartFile file); - /** - * 更新插件状态文件 - * - * @param pluginKeyNew 插件标识符 - * @param isEnabled 是否启用 - */ - void updatePluginStatusFile(String pluginKeyNew, boolean isEnabled); - /** * 更新插件状态 * diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/plugin/PluginInstanceServiceImpl.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/plugin/PluginInstanceServiceImpl.java index a4bae89647..4a62dbcb92 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/plugin/PluginInstanceServiceImpl.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/plugin/PluginInstanceServiceImpl.java @@ -21,11 +21,7 @@ import org.springframework.web.multipart.MultipartFile; import java.io.File; import java.io.IOException; -import java.net.Inet4Address; -import java.net.InetAddress; import java.nio.file.*; -import java.util.ArrayList; -import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; @@ -119,44 +115,6 @@ public class PluginInstanceServiceImpl implements PluginInstanceService { return pluginKeyNew; } - @Override - public void updatePluginStatusFile(String pluginKeyNew, boolean isEnabled) { - // TODO @haohao:疑问,这里写 enabled.txt 和 disabled.txt 的目的是啥哈? - // pf4j 的插件状态文件,需要 2 个文件,一个 enabled.txt 一个 disabled.txt - Path enabledFilePath = Paths.get(pluginsDir, "enabled.txt"); - Path disabledFilePath = Paths.get(pluginsDir, "disabled.txt"); - Path targetFilePath = isEnabled ? enabledFilePath : disabledFilePath; - Path oppositeFilePath = isEnabled ? disabledFilePath : enabledFilePath; - - try { - PluginWrapper pluginWrapper = pluginManager.getPlugin(pluginKeyNew); - if (pluginWrapper == null) { - throw exception(ErrorCodeConstants.PLUGIN_INSTALL_FAILED); - } - List targetLines = Files.exists(targetFilePath) ? Files.readAllLines(targetFilePath) - : new ArrayList<>(); - List oppositeLines = Files.exists(oppositeFilePath) ? Files.readAllLines(oppositeFilePath) - : new ArrayList<>(); - - if (!targetLines.contains(pluginKeyNew)) { - targetLines.add(pluginKeyNew); - Files.write(targetFilePath, targetLines, StandardOpenOption.CREATE, - StandardOpenOption.TRUNCATE_EXISTING); - log.info("已添加插件 {} 到 {}", pluginKeyNew, targetFilePath.getFileName()); - } - - if (oppositeLines.contains(pluginKeyNew)) { - oppositeLines.remove(pluginKeyNew); - Files.write(oppositeFilePath, oppositeLines, StandardOpenOption.CREATE, - StandardOpenOption.TRUNCATE_EXISTING); - log.info("已从 {} 移除插件 {}", oppositeFilePath.getFileName(), pluginKeyNew); - } - } catch (IOException e) { - log.error("[updatePluginStatusFile][更新插件状态文件失败]", e); - throw exception(ErrorCodeConstants.PLUGIN_INSTALL_FAILED, e); - } - } - @Override public void updatePluginStatus(PluginInfoDO pluginInfoDo, Integer status) { String pluginKey = pluginInfoDo.getPluginKey(); @@ -167,14 +125,12 @@ public class PluginInstanceServiceImpl implements PluginInstanceService { if (status.equals(IotPluginStatusEnum.RUNNING.getStatus()) && plugin.getPluginState() != PluginState.STARTED) { pluginManager.startPlugin(pluginKey); - updatePluginStatusFile(pluginKey, true); log.info("已启动插件: {}", pluginKey); } // 停止插件 else if (status.equals(IotPluginStatusEnum.STOPPED.getStatus()) && plugin.getPluginState() == PluginState.STARTED) { pluginManager.stopPlugin(pluginKey); - updatePluginStatusFile(pluginKey, false); log.info("已停止插件: {}", pluginKey); } } else { @@ -208,7 +164,7 @@ public class PluginInstanceServiceImpl implements PluginInstanceService { PluginInfoDO pluginInfo = pluginInfoMap.get(pluginKey); if (pluginInfo == null) { // 4.2 插件信息不存在,记录错误并跳过 - log.error("插件信息不存在,插件包标识符 = {}", pluginKey); + log.error("插件信息不存在,pluginKey = {}", pluginKey); continue; } diff --git a/yudao-module-iot/yudao-module-iot-plugin/yudao-module-iot-http-plugin/src/main/java/cn/iocoder/yudao/module/iot/plugin/HttpVertxPlugin.java b/yudao-module-iot/yudao-module-iot-plugin/yudao-module-iot-http-plugin/src/main/java/cn/iocoder/yudao/module/iot/plugin/HttpVertxPlugin.java index c1d587489d..1d6fcad92b 100644 --- a/yudao-module-iot/yudao-module-iot-plugin/yudao-module-iot-http-plugin/src/main/java/cn/iocoder/yudao/module/iot/plugin/HttpVertxPlugin.java +++ b/yudao-module-iot/yudao-module-iot-plugin/yudao-module-iot-http-plugin/src/main/java/cn/iocoder/yudao/module/iot/plugin/HttpVertxPlugin.java @@ -5,12 +5,15 @@ import cn.iocoder.yudao.module.iot.api.device.DeviceDataApi; import io.vertx.core.Vertx; import io.vertx.ext.web.Router; import io.vertx.ext.web.handler.BodyHandler; -import org.pf4j.Plugin; import org.pf4j.PluginWrapper; +import org.pf4j.spring.SpringPlugin; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; + import lombok.extern.slf4j.Slf4j; @Slf4j -public class HttpVertxPlugin extends Plugin { +public class HttpVertxPlugin extends SpringPlugin { private static final int PORT = 8092; private Vertx vertx; @@ -67,4 +70,13 @@ public class HttpVertxPlugin extends Plugin { }); } } + + @Override + protected ApplicationContext createApplicationContext() { + AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(); + applicationContext.setClassLoader(getWrapper().getPluginClassLoader()); + applicationContext.refresh(); + + return applicationContext; + } } \ No newline at end of file