From fd717e71bd17a811fa2fbe12b785db455ffff256 Mon Sep 17 00:00:00 2001 From: StarBlues Date: Sat, 17 Sep 2022 10:15:06 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=8F=92=E4=BB=B6=E5=81=9C?= =?UTF-8?q?=E6=AD=A2=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bootstrap/DefaultSpringPluginHook.java | 9 +-- .../realize/PluginCloseListener.java | 5 +- .../starblues/core/DefaultPluginManager.java | 61 +++++++++++-------- .../gitee/starblues/core/PluginCloseType.java | 27 ++++++++ .../starblues/core/PluginLauncherManager.java | 6 +- .../plugin/SpringPluginHookWrapper.java | 9 +-- .../starblues/spring/SpringPluginHook.java | 10 +-- update.md | 2 +- 8 files changed, 86 insertions(+), 43 deletions(-) create mode 100644 spring-brick/src/main/java/com/gitee/starblues/core/PluginCloseType.java diff --git a/spring-brick-bootstrap/src/main/java/com/gitee/starblues/bootstrap/DefaultSpringPluginHook.java b/spring-brick-bootstrap/src/main/java/com/gitee/starblues/bootstrap/DefaultSpringPluginHook.java index f2680f8..bd3fdb2 100644 --- a/spring-brick-bootstrap/src/main/java/com/gitee/starblues/bootstrap/DefaultSpringPluginHook.java +++ b/spring-brick-bootstrap/src/main/java/com/gitee/starblues/bootstrap/DefaultSpringPluginHook.java @@ -23,6 +23,7 @@ import com.gitee.starblues.bootstrap.realize.PluginCloseListener; import com.gitee.starblues.bootstrap.realize.StopValidator; import com.gitee.starblues.bootstrap.utils.DestroyUtils; import com.gitee.starblues.bootstrap.utils.SpringBeanUtils; +import com.gitee.starblues.core.PluginCloseType; import com.gitee.starblues.core.exception.PluginProhibitStopException; import com.gitee.starblues.spring.ApplicationContext; import com.gitee.starblues.spring.ApplicationContextProxy; @@ -77,10 +78,10 @@ public class DefaultSpringPluginHook implements SpringPluginHook { @Override - public void close(boolean isUninstall) throws Exception{ + public void close(PluginCloseType closeType) throws Exception{ try { GenericApplicationContext applicationContext = processorContext.getApplicationContext(); - callPluginCloseListener(applicationContext, isUninstall); + callPluginCloseListener(applicationContext, closeType); pluginProcessor.close(processorContext); applicationContext.close(); processorContext.clearRegistryInfo(); @@ -107,7 +108,7 @@ public class DefaultSpringPluginHook implements SpringPluginHook { return processorContext.getRegistryInfo(PluginThymeleafProcessor.CONFIG_KEY); } - private void callPluginCloseListener(GenericApplicationContext applicationContext, boolean isUninstall){ + private void callPluginCloseListener(GenericApplicationContext applicationContext, PluginCloseType closeType){ List pluginCloseListeners = SpringBeanUtils.getBeans( applicationContext, PluginCloseListener.class); if(pluginCloseListeners.isEmpty()){ @@ -115,7 +116,7 @@ public class DefaultSpringPluginHook implements SpringPluginHook { } for (PluginCloseListener pluginCloseListener : pluginCloseListeners) { try { - pluginCloseListener.close(applicationContext, processorContext.getPluginInfo(), isUninstall); + pluginCloseListener.close(applicationContext, processorContext.getPluginInfo(), closeType); } catch (Exception e){ e.printStackTrace(); } diff --git a/spring-brick-bootstrap/src/main/java/com/gitee/starblues/bootstrap/realize/PluginCloseListener.java b/spring-brick-bootstrap/src/main/java/com/gitee/starblues/bootstrap/realize/PluginCloseListener.java index 5dd8ebf..c151abf 100644 --- a/spring-brick-bootstrap/src/main/java/com/gitee/starblues/bootstrap/realize/PluginCloseListener.java +++ b/spring-brick-bootstrap/src/main/java/com/gitee/starblues/bootstrap/realize/PluginCloseListener.java @@ -16,6 +16,7 @@ package com.gitee.starblues.bootstrap.realize; +import com.gitee.starblues.core.PluginCloseType; import com.gitee.starblues.core.PluginInfo; import com.gitee.starblues.core.descriptor.PluginDescriptor; import org.springframework.context.support.GenericApplicationContext; @@ -40,11 +41,11 @@ public interface PluginCloseListener { * 关闭时调用 * @param applicationContext 当前插件的ApplicationContext * @param pluginInfo 当前插件信息 - * @param isUninstall 是否为卸载关闭。true: 为卸载, false 不为卸载 + * @param closeType 停止类型 * @since 3.1.0 */ default void close(GenericApplicationContext applicationContext, - PluginInfo pluginInfo, boolean isUninstall){ + PluginInfo pluginInfo, PluginCloseType closeType){ close(pluginInfo != null ? pluginInfo.getPluginDescriptor() : null); } diff --git a/spring-brick/src/main/java/com/gitee/starblues/core/DefaultPluginManager.java b/spring-brick/src/main/java/com/gitee/starblues/core/DefaultPluginManager.java index 392d847..d7ab7bb 100644 --- a/spring-brick/src/main/java/com/gitee/starblues/core/DefaultPluginManager.java +++ b/spring-brick/src/main/java/com/gitee/starblues/core/DefaultPluginManager.java @@ -49,8 +49,8 @@ import java.util.stream.Collectors; /** * 抽象的插件管理者 * @author starBlues - * @version 3.1.0 * @since 3.0.0 + * @version 3.1.0 */ public class DefaultPluginManager implements PluginManager{ @@ -263,28 +263,10 @@ public class DefaultPluginManager implements PluginManager{ @Override public synchronized void uninstall(String pluginId) throws PluginException { - Assert.isNotNull(pluginId, "参数pluginId不能为空"); - PluginInsideInfo wrapperInside = getPlugin(pluginId); - if(wrapperInside == null){ - throw new PluginException("没有发现插件: " + pluginId); - } - PluginInfo pluginInfo = wrapperInside.toPluginInfo(); - if(wrapperInside.getPluginState() == PluginState.STARTED){ - try { - stop(wrapperInside, true); - pluginListenerFactory.stopSuccess(pluginInfo); - } catch (Throwable e) { - PluginException pluginException = PluginException.getPluginException(e, - ()-> new PluginException("停止", pluginId, e)); - pluginListenerFactory.stopFailure(pluginInfo, pluginException); - throw pluginException; - } - } - startedPlugins.remove(pluginId); - unLoad(pluginId); - LogUtils.info(log, wrapperInside.getPluginDescriptor(), "卸载成功"); + uninstall(pluginId, PluginCloseType.UNINSTALL); } + @Override public synchronized PluginInfo upgrade(Path pluginPath, boolean unpackPlugin) throws PluginException { Assert.isNotNull(pluginPath, "参数pluginPath不能为空"); @@ -307,7 +289,7 @@ public class DefaultPluginManager implements PluginManager{ checkVersion(oldPlugin.getPluginDescriptor(), upgradePluginDescriptor); if(oldPlugin.getPluginState() == PluginState.STARTED){ // 如果插件被启动, 则卸载旧的插件 - uninstall(pluginId); + uninstall(pluginId, PluginCloseType.UPGRADE_UNINSTALL); } else if(oldPlugin.getPluginState() == PluginState.LOADED){ // 如果插件被load unLoad(pluginId); @@ -357,7 +339,7 @@ public class DefaultPluginManager implements PluginManager{ } PluginInfo pluginInfo = pluginInsideInfo.toPluginInfo(); try { - stop(pluginInsideInfo, false); + stop(pluginInsideInfo, PluginCloseType.STOP); log.info("停止插件[{}]成功", MsgUtils.getPluginUnique(pluginInsideInfo.getPluginDescriptor())); pluginListenerFactory.stopSuccess(pluginInfo); return pluginInfo; @@ -398,6 +380,35 @@ public class DefaultPluginManager implements PluginManager{ return pluginDescriptors; } + /** + * 卸载插件 + * @param pluginId 插件id + * @param closeType 关闭类型 + * @throws PluginException 卸载异常 + */ + protected void uninstall(String pluginId, PluginCloseType closeType) throws PluginException{ + Assert.isNotNull(pluginId, "参数pluginId不能为空"); + PluginInsideInfo wrapperInside = getPlugin(pluginId); + if(wrapperInside == null){ + throw new PluginException("没有发现插件: " + pluginId); + } + PluginInfo pluginInfo = wrapperInside.toPluginInfo(); + if(wrapperInside.getPluginState() == PluginState.STARTED){ + try { + stop(wrapperInside, closeType); + pluginListenerFactory.stopSuccess(pluginInfo); + } catch (Throwable e) { + PluginException pluginException = PluginException.getPluginException(e, + ()-> new PluginException("停止", pluginId, e)); + pluginListenerFactory.stopFailure(pluginInfo, pluginException); + throw pluginException; + } + } + startedPlugins.remove(pluginId); + unLoad(pluginId); + LogUtils.info(log, wrapperInside.getPluginDescriptor(), "卸载成功"); + } + protected PluginInsideInfo loadPlugin(Path pluginPath, boolean resolvePath) { if(resolvePath){ Path sourcePluginPath = pluginPath; @@ -539,10 +550,10 @@ public class DefaultPluginManager implements PluginManager{ /** * 统一停止插件操作 * @param pluginInsideInfo PluginInsideInfo - * @param isUninstall 是否为卸载停止 + * @param closeType 停止类型 * @throws Exception 启动异常 */ - protected void stop(PluginInsideInfo pluginInsideInfo, boolean isUninstall) throws Exception{ + protected void stop(PluginInsideInfo pluginInsideInfo, PluginCloseType closeType) throws Exception{ launcherChecker.checkCanStop(pluginInsideInfo); pluginInsideInfo.setPluginState(PluginState.STOPPED); stopFinish(pluginInsideInfo); diff --git a/spring-brick/src/main/java/com/gitee/starblues/core/PluginCloseType.java b/spring-brick/src/main/java/com/gitee/starblues/core/PluginCloseType.java new file mode 100644 index 0000000..0aef5e4 --- /dev/null +++ b/spring-brick/src/main/java/com/gitee/starblues/core/PluginCloseType.java @@ -0,0 +1,27 @@ +package com.gitee.starblues.core; + +/** + * 插件关闭类型 + * + * @author starBlues + * @since 3.1.0 + * @version 3.1.0 + */ +public enum PluginCloseType { + + /** + * 直接操作停止 + */ + STOP, + + /** + * 卸载时停止 + */ + UNINSTALL, + + /** + * 升级时停止 + */ + UPGRADE_UNINSTALL + +} diff --git a/spring-brick/src/main/java/com/gitee/starblues/core/PluginLauncherManager.java b/spring-brick/src/main/java/com/gitee/starblues/core/PluginLauncherManager.java index 69bf900..bb15301 100644 --- a/spring-brick/src/main/java/com/gitee/starblues/core/PluginLauncherManager.java +++ b/spring-brick/src/main/java/com/gitee/starblues/core/PluginLauncherManager.java @@ -120,7 +120,7 @@ public class PluginLauncherManager extends DefaultPluginManager{ } @Override - protected void stop(PluginInsideInfo pluginInsideInfo, boolean isUninstall) throws Exception { + protected void stop(PluginInsideInfo pluginInsideInfo, PluginCloseType closeType) throws Exception { launcherChecker.checkCanStop(pluginInsideInfo); String pluginId = pluginInsideInfo.getPluginId(); RegistryPluginInfo registryPluginInfo = registryInfo.get(pluginId); @@ -130,10 +130,10 @@ public class PluginLauncherManager extends DefaultPluginManager{ try { SpringPluginHook springPluginHook = registryPluginInfo.getSpringPluginHook(); springPluginHook.stopVerify(); - springPluginHook.close(isUninstall); + springPluginHook.close(closeType); invokeSupperCache.remove(pluginId); registryInfo.remove(pluginId); - super.stop(pluginInsideInfo, isUninstall); + super.stop(pluginInsideInfo, closeType); } catch (Exception e){ if(e instanceof PluginProhibitStopException){ // 禁止停止时, 不设置插件状态 diff --git a/spring-brick/src/main/java/com/gitee/starblues/core/launcher/plugin/SpringPluginHookWrapper.java b/spring-brick/src/main/java/com/gitee/starblues/core/launcher/plugin/SpringPluginHookWrapper.java index 3ccdf43..a2c6b95 100644 --- a/spring-brick/src/main/java/com/gitee/starblues/core/launcher/plugin/SpringPluginHookWrapper.java +++ b/spring-brick/src/main/java/com/gitee/starblues/core/launcher/plugin/SpringPluginHookWrapper.java @@ -16,8 +16,8 @@ package com.gitee.starblues.core.launcher.plugin; +import com.gitee.starblues.core.PluginCloseType; import com.gitee.starblues.core.PluginInsideInfo; -import com.gitee.starblues.core.descriptor.InsidePluginDescriptor; import com.gitee.starblues.core.exception.PluginProhibitStopException; import com.gitee.starblues.core.launcher.plugin.involved.PluginLaunchInvolved; import com.gitee.starblues.spring.ApplicationContext; @@ -30,7 +30,8 @@ import lombok.extern.slf4j.Slf4j; /** * SpringPluginHook-Wrapper * @author starBlues - * @version 3.0.0 + * @since 3.0.0 + * @version 3.1.0 */ @Slf4j public class SpringPluginHookWrapper implements SpringPluginHook { @@ -70,14 +71,14 @@ public class SpringPluginHookWrapper implements SpringPluginHook { } @Override - public void close(boolean isUninstall) throws Exception { + public void close(PluginCloseType closeType) throws Exception { try { pluginLaunchInvolved.close(pluginInsideInfo, classLoader); } catch (Exception e){ log.error("关闭插件异常: {}", e.getMessage(), e); } try { - target.close(isUninstall); + target.close(closeType); } finally { ResourceUtils.closeQuietly(classLoader); } diff --git a/spring-brick/src/main/java/com/gitee/starblues/spring/SpringPluginHook.java b/spring-brick/src/main/java/com/gitee/starblues/spring/SpringPluginHook.java index 6cf5c61..54a121d 100644 --- a/spring-brick/src/main/java/com/gitee/starblues/spring/SpringPluginHook.java +++ b/spring-brick/src/main/java/com/gitee/starblues/spring/SpringPluginHook.java @@ -17,13 +17,15 @@ package com.gitee.starblues.spring; +import com.gitee.starblues.core.PluginCloseType; import com.gitee.starblues.core.exception.PluginProhibitStopException; import com.gitee.starblues.spring.web.thymeleaf.ThymeleafConfig; /** * 插件把柄接口 * @author starBlues - * @version 3.0.0 + * @since 3.0.0 + * @version 3.1.0 */ public interface SpringPluginHook { @@ -52,11 +54,11 @@ public interface SpringPluginHook { ThymeleafConfig getThymeleafConfig(); /** - * 卸载调用 - * @param isUninstall 是否是卸载关闭 + * 关闭调用 + * @param closeType 关闭类型 * @since 3.1.0 * @throws Exception 关闭异常 */ - void close(boolean isUninstall) throws Exception; + void close(PluginCloseType closeType) throws Exception; } diff --git a/update.md b/update.md index 87c29f1..6d62995 100644 --- a/update.md +++ b/update.md @@ -1,7 +1,7 @@ 1. 【新增】增加主包MAINIFEST中title和version定义, 标准jar包中包含`Implementation-Version`和`Implementation-Title`属性 2. 【新增】新增根据个人需求选择开发模式,支持隔离式开发模式(目前已有的)、共享式开发模式 3. 【新增】新增可自主实现扩展插件信息 -4. 【新增】新增插件可判断卸载事件 +4. 【新增】新增插件停止类型 3. 【修复】修复插件中`LiveBeansView`注册异常问题 4. 【修复[#I5IFR4](https://gitee.com/starblues/springboot-plugin-framework-parent/issues/I5IFR3)】 `ExtractFactory#getExtractByCoordinate` 类型转换`Bug` 5. 【修复[#I5GJO9](https://gitee.com/starblues/springboot-plugin-framework-parent/issues/I5GJO9)】`DefaultPluginManager#install` 异常无法抛出 -- Gitee