【代码优化】重构 HTTP插件并添加自动配置

This commit is contained in:
安浩浩
2025-01-26 17:29:03 +08:00
parent 269dec1b2e
commit 7bfa830628
10 changed files with 204 additions and 109 deletions

View File

@@ -40,9 +40,7 @@ import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionU
@Slf4j
public class PluginInstanceServiceImpl implements PluginInstanceService {
// TODO @haohao这个可以后续确认下,有没更合适的标识。例如说 mac 地址之类的
// 简化的 UUID + mac 地址 会不会好一些,一台机子有可能会部署多个插件;
// 那就 mac@uuid
// TODO @haohaomac@uuid
public static final String MAIN_ID = IdUtil.fastSimpleUUID();
@Resource
@@ -60,32 +58,31 @@ public class PluginInstanceServiceImpl implements PluginInstanceService {
@Override
public void stopAndUnloadPlugin(String pluginKey) {
PluginWrapper plugin = pluginManager.getPlugin(pluginKey);
// TODO @haohao改成 if return 会更简洁一点;
if (plugin != null) {
if (plugin.getPluginState().equals(PluginState.STARTED)) {
pluginManager.stopPlugin(pluginKey); // 停止插件
log.info("已停止插件: {}", pluginKey);
}
pluginManager.unloadPlugin(pluginKey); // 卸载插件
log.info("已卸载插件: {}", pluginKey);
} else {
if (plugin == null) {
log.warn("插件不存在或已卸载: {}", pluginKey);
return;
}
if (plugin.getPluginState().equals(PluginState.STARTED)) {
pluginManager.stopPlugin(pluginKey); // 停止插件
log.info("已停止插件: {}", pluginKey);
}
pluginManager.unloadPlugin(pluginKey); // 卸载插件
log.info("已卸载插件: {}", pluginKey);
}
@Override
public void deletePluginFile(PluginInfoDO pluginInfoDO) {
File file = new File(pluginsDir, pluginInfoDO.getFileName());
// TODO @haohao改成 if return 会更简洁一点;
if (file.exists()) {
try {
TimeUnit.SECONDS.sleep(1); // 等待 1 秒,避免插件未卸载完毕
if (!file.delete()) {
log.error("[deletePluginInfo][删除插件文件({}) 失败]", pluginInfoDO.getFileName());
}
} catch (InterruptedException e) {
log.error("[deletePluginInfo][删除插件文件({}) 失败]", pluginInfoDO.getFileName(), e);
if (!file.exists()) {
return;
}
try {
TimeUnit.SECONDS.sleep(1); // 等待 1 秒,避免插件未卸载完毕
if (!file.delete()) {
log.error("[deletePluginInfo][删除插件文件({}) 失败]", pluginInfoDO.getFileName());
}
} catch (InterruptedException e) {
log.error("[deletePluginInfo][删除插件文件({}) 失败]", pluginInfoDO.getFileName(), e);
}
}
@@ -120,25 +117,25 @@ public class PluginInstanceServiceImpl implements PluginInstanceService {
String pluginKey = pluginInfoDo.getPluginKey();
PluginWrapper plugin = pluginManager.getPlugin(pluginKey);
// TODO @haohao改成 if return 会更简洁一点;
if (plugin != null) {
// 启动插件
if (status.equals(IotPluginStatusEnum.RUNNING.getStatus())
&& plugin.getPluginState() != PluginState.STARTED) {
pluginManager.startPlugin(pluginKey);
log.info("已启动插件: {}", pluginKey);
}
// 停止插件
else if (status.equals(IotPluginStatusEnum.STOPPED.getStatus())
&& plugin.getPluginState() == PluginState.STARTED) {
pluginManager.stopPlugin(pluginKey);
log.info("已停止插件: {}", pluginKey);
}
} else {
if (plugin == null) {
// 插件不存在且状态为停止,抛出异常
if (IotPluginStatusEnum.STOPPED.getStatus().equals(pluginInfoDo.getStatus())) {
throw exception(ErrorCodeConstants.PLUGIN_STATUS_INVALID);
}
return;
}
// 启动插件
if (status.equals(IotPluginStatusEnum.RUNNING.getStatus())
&& plugin.getPluginState() != PluginState.STARTED) {
pluginManager.startPlugin(pluginKey);
log.info("已启动插件: {}", pluginKey);
}
// 停止插件
else if (status.equals(IotPluginStatusEnum.STOPPED.getStatus())
&& plugin.getPluginState() == PluginState.STARTED) {
pluginManager.stopPlugin(pluginKey);
log.info("已停止插件: {}", pluginKey);
}
}
@@ -152,10 +149,10 @@ public class PluginInstanceServiceImpl implements PluginInstanceService {
Map<String, PluginInfoDO> pluginInfoMap = pluginInfos.stream()
.collect(Collectors.toMap(PluginInfoDO::getPluginKey, Function.identity()));
// 1.3 获取本机 IP 和 MAC 地址
// 1.3 获取本机 IP 和 MAC 地址,mac@uuid
String ip = NetUtil.getLocalhostStr();
String mac = NetUtil.getLocalMacAddress();
String mainId = MAIN_ID + "-" + mac;
String mainId = mac + "@" + MAIN_ID;
// 2. 遍历插件列表,并保存为插件实例
for (PluginWrapper plugin : plugins) {
@@ -173,14 +170,21 @@ public class PluginInstanceServiceImpl implements PluginInstanceService {
pluginInfo.getId());
if (pluginInstance == null) {
// 4.4 如果插件实例不存在,则创建
pluginInstance = PluginInstanceDO.builder().pluginId(pluginInfo.getId()).mainId(MAIN_ID + "-" + mac)
.ip(ip).port(port).heartbeatAt(System.currentTimeMillis()).build();
pluginInstance = PluginInstanceDO.builder()
.pluginId(pluginInfo.getId())
.mainId(MAIN_ID + "-" + mac)
.ip(ip)
.port(port)
.heartbeatAt(System.currentTimeMillis())
.build();
pluginInstanceMapper.insert(pluginInstance);
} else {
// 2.2 情况二:如果存在,则更新 heartbeatAt
// TODO @haohao这里最好 new 去 update避免并发更新虽然目前没有
pluginInstance.setHeartbeatAt(System.currentTimeMillis());
pluginInstanceMapper.updateById(pluginInstance);
PluginInstanceDO updatePluginInstance = PluginInstanceDO.builder()
.id(pluginInstance.getId())
.heartbeatAt(System.currentTimeMillis())
.build();
pluginInstanceMapper.updateById(updatePluginInstance);
}
}
}