首页 > 其他分享 >Solon2 开发之插件,四、插件热插拔管理机制(H-Spi)

Solon2 开发之插件,四、插件热插拔管理机制(H-Spi)

时间:2023-02-13 22:34:45浏览次数:58  
标签:插件 热插拔 Spi context 移除 data public

插件热插拔管理机制,简称:H-Spi。是框架提供的生产时用的另一种高级扩展方案。相对E-Spi,H-Spi 更侧重隔离、热插热拔、及管理性。

应用时,是以一个业务模块为单位进行开发,且封装为一个独立插件包。

1、特点说明

  • 所有插件包独享ClassLoader、AopContext、配置;完全隔离
    • 可通过 Solon.app(), Solon.cfg(), Solon.context() 等...手动获取主程序或全局的资源
  • 模块可以打包成一个独立的插件包(放在体外加载),也可以与主程序一起打包。“分”或“合”也是自由!
  • 更新插件包,不需要重启主服务。热更新!
  • 开发时,所有资源完全独立自控。且必须完成资源移除的任务
  • 模块之间的通讯,尽量交由事件总线(EventBus)处理。且尽量用弱类型的事件数据(如Map,或 JsonString)
  • 主程序需要引入 "solon.hotplug" 依赖,对业务插件包进行管理

2、插件开发注意示例

  • 插件在“启动”时添加到公共场所的资源或对象,必须在插件停止时须移除掉(为了能热更新):
public class Plugin1Impl implements Plugin {
    AopContext context;
    StaticRepository staticRepository;

    @Override
    public void start(AopContext context) {
        this.context = context;
        
        //添加自己的配置文件
        this.context.cfg().loadAdd("demo1011.plugin1.yml");
        //扫描自己的bean
        this.context.beanScan(Plugin1Impl.class);

        //添加自己的静态文件仓库(注册classloader)
        staticRepository = new ClassPathStaticRepository(context.getClassLoader(), "plugin1_static");
        StaticMappings.add("/html/", staticRepository);
    }

    @Override
    public void stop() throws Throwable {
        //移除http处理。//用前缀,方便移除
        Solon.app().router().remove("/user");

        //移除定时任务(如果有定时任务,选支持手动移除的方案)
        JobManager.remove("job1");

        //移除事件订阅
        context.beanForeach(bw -> {
            if (bw.raw() instanceof EventListener) {
                EventBus.unsubscribe(bw.raw());
            }
        });

        //移除静态文件仓库
        StaticMappings.remove(staticRepository);
    }
}
  • 一些涉及 classloader 的相关细节,需要多多注意。比如后端模板的渲染:
public class BaseController implements Render {
    //要考虑模板所在的classloader
    static final FreemarkerRender viewRender = new FreemarkerRender(BaseController.class.getClassLoader());

    @Override
    public void render(Object data, Context ctx) throws Throwable {
        if (data instanceof Throwable) {
            throw (Throwable) data;
        }

        if (data instanceof ModelAndView) {
            viewRender.render(data, ctx);
        } else {
            ctx.render(data);
        }
    }
}
  • 更多细节,需要根据业务情况多多注意。

3、插件管理

插件有管理能力后,还可以仓库化,平台化。详见:《生态 / Solon / solon.hotplug》

标签:插件,热插拔,Spi,context,移除,data,public
From: https://www.cnblogs.com/noear/p/17118083.html

相关文章

  • Solon2 开发之插件,一、插件
    SolonPlugin是框架的核心接口,简称“插件”。其本质是一个“生命周期”接口。它可让一个组件类参与程序的生命周期过程(这块看下:《应用启动过程与完整生命周期》):@Function......
  • BurpSuite插件——新建UI界面且监听访问HTTP信息
    一、写在前面很久没更新了,一个是事情比较多、杂,而且这段时间有很多新知识和认知的冲击,不得不停下来沉淀一下。今天起正式开始一个新的模块——burp插件开发。 二、......
  • Spider理论系列-bs4
    写在前面bs4最直接的应用就是我在爬取​​Spider实战系列-爬取鬼吹灯小说_浅辄的技术博客_51CTO博客​​这一篇里,我同时使用了bs4和xpath,相对于特定的情况,速度也会有所......
  • 图片放大插件zoomify
         地址:https://github.com/indrimuska/zoomify<scripttype="text/javascript"> $('.exampleimg').zoomify(); </script> ......
  • 22 插件
    1、功能:用于增强Vue2、本质:包含install方法的一个对象,install的第一个参数的Vue,第二个及以后的参数是插件使用这传递的数据。定义插件:  对象.install=function(Vu......
  • laydate插件实现时间选择器
    文章目录​​一、前言:​​​​二、年选择器:​​​​1、引入js和css文件:​​​​2、写一个input标签:​​​​3、执行一个laydate实例​​​​4、页面效果:​​​​三、年月选......
  • 利用bootstrap-table插件自带的打印功能打印表格
    文章目录​​1、前端代码:​​​​2、前端页面:​​​​1、表格数据展示​​​​2、点击打印按钮之后:​​​​3、插件下载地址:​​​​4、碰到的bug​​1、前端代码:<linkhre......
  • bootstrap-suggest插件
    文章目录​​一、bootstrap-suggest​​​​1.1功能说明​​​​1.2实现效果:​​​​1.3方法调用​​​​1.4事件监听​​​​1.5完整代码实现:​​​​1.5.1前端关键......
  • chatGPT中文版-插件初体验
            话说当年上学那会校园流行的,是一个叫表表机器人(高校智能课程表)的软件,是我最早接触的智能对话,觉得非常有趣,常常一个人能上玩半个小时,后来随着智能......
  • bootstrap-suggest插件处理复杂对象时的解决方案
    文章目录​​一、问题描述:​​​​二、解决办法:​​​​后端代码:​​​​jsp页面:​​​​js代码渲染:​​​​实现效果:​​​​三、插件下载地址:​​一、问题描述:在用bootst......