<dependency>
<groupId>org.noear</groupId>
<artifactId>solon.hotplug</artifactId>
</dependency>

1、描述

基础扩展插件,提供业务插件的 '热插拔' 和 '热管理' 支持。(常规情况,使用普通的体外扩展机制E-Spi即可)。

所谓'热':即更新扩展包后不需要重启主程序,通过接口或界面进行管理;但开发也会有一些新制约。

需要让热插拔的扩展包,尽量领域独立,尽量不与别人交互,要让一些资源能“拔”掉。

2、热插拔

这是基础接口,但一般不直接使用。而使用管理接口。

public class DemoApp {
public static void main(String[] args) {
Solon.start(Test5App.class, args); File jarFile = new File("/xxx/xxx.jar"); //加载插件并启动
PluginPackage jarPlugin = PluginManager.loadJar(jarFile).start(); //卸载插件
PluginManager.unloadJar(jarPlugin);
}
}

3、热管理示例

  • 配置管理的插件
solon.hotplug:
add1: "/x/x/x.jar" #格式 name: jarfile
add2: "/x/x/x2.jar"

也可以通过代码添加待管理插件(还可以,通过数据库进行管理;进而平台化)

PluginManager.add("add1", "/x/x/x.jar");
PluginManager.add("add2", "/x/x/x2.jar");
//PluginManager.remove("add2");//移除插件
  • 管理插件
//PluginManager.load("add2"); //加载插件
//PluginManager.start("add2"); //启动插件(未加载的话,自动加载)
//PluginManager.stop("add2"); //停止插件
//PluginManager.unload("add2"); //卸载插件(未停止的话,自动停止) public class App {
public static void main(String[] args) {
Solon.start(App.class, args, app -> {
//启动插件
app.get("start", ctx -> {
PluginManager.start("add1");
ctx.output("OK");
}); //停止插件
app.get("stop", ctx -> {
PluginManager.stop("add1");
ctx.output("OK");
});
});
}
}

4、注意事项

  • 插件包名需独立性(避免描扫时扫到别人)

    • 例主程包为:xxxxxx.main
    • 插件1包为:xxx.add1
    • 插件2包为:xxx.add2
  • 依赖包的放置
    • 一般公共的放到主程序包(可以让插件包,更小)
    • 如果需要隔离的放到插件包
  • 如何获取主程序资源 ?????????
    • 通过 Solon.context().getBean() 获取主程序的Bean
    • 通过 Solon.cfg() 获取主程序的配置

5、插件代码示例

相对于普通的插件,要在 preStop 或 stop 时移除注册的相关资源。这很重要!

public class Plugin1Impl implements Plugin {
AopContext context;
StaticRepository staticRepository; @Override
public void start(AopContext context) {
this.context = context; //扫描自己的组件
this.context.beanScan(Plugin1Impl.class); //添加自己的静态文件
staticRepository = new ClassPathStaticRepository(context.getClassLoader(), "plugin1_static");
StaticMappings.add("/", 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);
}
}

6、具体的演示项目

Solon 的热插拔能力框架 “solon.hotplug” 介绍的更多相关文章

  1. Solon详解(六)- Solon的校验扩展框架使用与扩展

    Solon详解系列文章: Solon详解(一)- 快速入门 Solon详解(二)- Solon的核心 Solon详解(三)- Solon的web开发 Solon详解(四)- Solon的事务传播机制 ...

  2. Spring Boot & Cloud 轻量替代框架 Solon 1.3.37 发布

    Solon 是一个微型的Java开发框架.强调,克制 + 简洁 + 开放的原则:力求,更小.更快.更自由的体验.支持:RPC.REST API.MVC.Micro service.WebSocket. ...

  3. Spring Boot & Cloud 轻量替代框架 Solon 1.4.1 发布

    Solon 是一个微型的Java开发框架.强调,克制 + 简洁 + 开放的原则:力求,更小.更快.更自由的体验.支持:RPC.REST API.MVC.Micro service.WebSocket. ...

  4. 对标 Spring Boot & Cloud ,轻量框架 Solon 1.4.8 发布

    Solon 是一个轻量的Java基础开发框架.强调,克制 + 简洁 + 开放的原则:力求,更小.更快.更自由的体验.支持:RPC.REST API.MVC.Job.Micro service.WebS ...

  5. 对标 Spring Boot & Cloud ,轻量框架 Solon 1.4.12 发布

    Solon 是一个轻量的Java基础开发框架.强调,克制 + 简洁 + 开放的原则:力求,更小.更快.更自由的体验.支持:RPC.REST API.MVC.Job.Micro service.WebS ...

  6. Springboot 轻量替代框架 Solon 1.3.10 发布

    Solon 是一个微型的Java开发框架.项目从2018年启动以来,参考过大量前人作品:历时两年,4000多次的commit:内核保持0.1m的身材,超高的跑分,良好的使用体验.支持:RPC.REST ...

  7. 对标 Spring Boot & Cloud ,轻量框架 Solon 1.4.14 发布

    Solon 是一个轻量的Java基础开发框架.强调,克制 + 简洁 + 开放的原则:力求,更小.更快.更自由的体验.支持:RPC.REST API.MVC.Job.Micro service.WebS ...

  8. 对标 Spring Boot & Cloud ,轻量框架 Solon 1.5.2 重要发布

    Solon 是一个轻量的Java基础开发框架.强调,克制 + 简洁 + 开放的原则:力求,更小.更快.更自由的体验.支持:RPC.REST API.MVC.Job.Micro service.WebS ...

  9. 对标 Spring Boot & Cloud ,轻量框架 Solon 1.5.8 发布

    Solon 是一个轻量的Java基础开发框架.强调,克制 + 简洁 + 开放的原则:力求,更小.更快.更自由的体验.支持:RPC.REST API.MVC.Job.Micro service.WebS ...

  10. Spring Boot & Cloud 轻量替代框架 Solon 1.3.33 发布

    Solon 是一个微型的Java开发框架.强调,克制 + 简洁 + 开放的原则:力求,更小.更快.更自由的体验.支持:RPC.REST API.MVC.Micro service.WebSocket. ...

随机推荐

  1. openwrt使用tailscale实现内网穿透

    问题 之前一直有电信公网ip,最近发现电信公网ip被撤下来了,打电话再去要发现给的是10开头的ip,电信客服还跟我说10开头就是公网ip,= =,根本就不是,无奈使用zerotier进行打洞,把zer ...

  2. 【pwn】整数溢出

    这是ctfshow上面的一道题 这边v1和v2定义时都是int,有符号整数,想让v1-v2=9,可以考虑负数,但是这个函数过滤了负号   if ( strchr(s, 45) )    return ...

  3. AI歌姬,C位出道,基于PaddleHub/Diffsinger实现音频歌声合成操作(Python3.10)

    懂乐理的音乐专业人士可以通过写乐谱并通过乐器演奏来展示他们的音乐创意和构思,但不识谱的素人如果也想跨界玩儿音乐,那么门槛儿就有点高了.但随着人工智能技术的快速迭代,现在任何一个人都可以成为" ...

  4. 配置tabBar导航菜单与open跳转差异

    "tabBar": {        "color": "#333",        "selectedColor": ...

  5. 使用 FastEndpoints 来垂直切换Web API的控制器方法

    在我们开发项目的Web API的时候,随着项目功能要求越来越多,可能我们会为控制器基类增加越来越多的基础功能,有些功能有一定的适应性,但可能在一般的子类中用不到,而随着对控制器控制要求越来越精细,那么 ...

  6. Java核心知识体系8:Java如何保证线程安全性

    Java核心知识体系1:泛型机制详解 Java核心知识体系2:注解机制详解 Java核心知识体系3:异常机制详解 Java核心知识体系4:AOP原理和切面应用 Java核心知识体系5:反射机制详解 J ...

  7. MongoDB中的分布式集群架构

    MongoDB 中的分布式集群架构 前言 Replica Set 副本集模式 副本集写和读的特性 Sharding 分片模式 分片的优势 MongoDB 分片的组件 分片键 chunk 是什么 分片的 ...

  8. 开源不挣钱?这个项目上线半年月入超 30w

    很兴奋的告诉大家,Sealos 自从 6 月份上线以来,仅半年时间注册用户已经突破 7万,月收入超过 30w,本文来向大家介绍我们是怎么做开源商业化的.每月平均增速超过 40%,而且这些收入大部分来自 ...

  9. Scrapy-CrawlSpider爬虫类使用案例

    CrawlSpider类型的爬虫会根据指定的rules规则自动找到url比自动爬取. 优点:适合整站爬取,自动翻页爬取 缺点:比较难以通过meta传参,只适合一个页面就能拿完数据的. import s ...

  10. 内核模块(.ko) 开发入门

    内核模块时指的是在操作系统内核中动态加载的一段代码,它可以扩展和增强操作系统的功能.内核模块通常用于为操作系统添加新的设备驱动程序.文件系统.网络协议栈等功能. 内核模块是以二进制形式存在的(*.ko ...