Quick-Task 动态脚本支持框架之Groovy脚本加载执行
上一篇简答说了如何判断有任务动态添加、删除或更新,归于一点就是监听文件的变化,判断目录下的Groovy文件是否有新增删除和改变,从而判定是否有任务的变更;
接下来的问题就比较明显了,当任务变更之后,就需要重新加载任务了,即如何动态的编译并执行Groovy文件呢?
相关系列博文:
- 180628-Quick-Task 动态任务执行框架想法篇
- 180702-Quick-Task 动态脚本支持框架整体介绍篇
- 180723-Quick-Task 动态脚本支持框架之结构设计篇
- 180729-Quick-Task 动态脚本支持框架之任务动态加载
I. Groovy文件动态加载
要想动态加载类,可以怎么办?如果对JVM有一定了解的朋友可能知道,自定义一个ClassLoader,可以实现从文件/网络/DB/Jar包中读取class文件,而Groovy,动态语言,简单来说就是.groovy文件可以直接运行,那么我们编码中要怎么玩?
1. 依赖
让我自己来实现Groovy文件的编译执行,目前基本上是看不到啥希望的,所以果断的借助第三方工具类加载Groovy文件
pom文件添加依赖
1 | <dependency> |
2. 加载Groovy
直接利用上面jar包中提供的GroovyCalssLoader来加载Groovy文件即可,使用也比较简单
1 | @Slf4j |
上面看着挺多,关键地方就三行,编译为class对象之后,借助反射来创建对象
1 | GroovyClassLoader loader = new GroovyClassLoader(classLoader); |
另外还有一行,也可以顺带凑一眼,判断一个class是否为另一个class的子类,用的是
1 | interfaceType.isAssignableFrom(clz) |
而判断某个对象是否为某类的子类用的则是 instance of
3. 调用包装
上面既然提供了一个工具类,那么接上篇的获取变动文件之后,获取File对象,借此拿到任务对象,就比较清晰了
1 | @Slf4j |
4. 小结
本篇内容比较简单,知识点也没多少,一个是利用GroovyClassLoader
来编译Groovy文件并获取实例;另一个就是如何判断一个class是否为另一个class的子类
还有一个隐藏的点上面没有说,那就是上面的GroovyCompile文件中,每次加载Groovy文件时,都是新创建了一个GroovyClassLoader,并由它来加载并实例Groovy任务,那么问题来了
- 能否用一个GoorvyClassLoader来管理所有的Groovy任务呢?
- 上面的代码实现中,不同的Groovy任务之间,可以相互通信么?
针对上面的问题,暂不给出答案,后面再说
II. 其他
0. 相关
博文:
- 180628-Quick-Task 动态任务执行框架想法篇
- 180702-Quick-Task 动态脚本支持框架整体介绍篇
- 180723-Quick-Task 动态脚本支持框架之结构设计篇
- 180729-Quick-Task 动态脚本支持框架之任务动态加载
项目:
1. 一灰灰Blog: https://liuyueyi.github.io/hexblog
一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛
2. 声明
尽信书则不如,已上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激
- 微博地址: 小灰灰Blog
- QQ: 一灰灰/3302797840
3. 扫描关注
一灰灰blog
知识星球