宁波网站建设培训,打造一个网站,做网站work什,免费建设钓鱼网站平台插件热插拔管理机制#xff0c;简称#xff1a;H-Spi。是框架提供的生产时用的另一种高级扩展方案。相对E-Spi#xff0c;H-Spi 更侧重隔离、热插热拔、及管理性。
应用时#xff0c;是以一个业务模块为单位进行开发#xff0c;且封装为一个独立插件包。
1、特点说明
所…插件热插拔管理机制简称H-Spi。是框架提供的生产时用的另一种高级扩展方案。相对E-SpiH-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;Overridepublic void start(AopContext context) {this.context context;//添加自己的配置文件this.context.cfg().loadAdd(demo1011.plugin1.yml);//扫描自己的beanthis.context.beanScan(Plugin1Impl.class);//添加自己的静态文件仓库注册classloaderstaticRepository new ClassPathStaticRepository(context.getClassLoader(), plugin1_static);StaticMappings.add(/html/, staticRepository);}Overridepublic 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 {//要考虑模板所在的classloaderstatic final FreemarkerRender viewRender new FreemarkerRender(BaseController.class.getClassLoader());Overridepublic 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》