180807-Quick-Task 动态脚本支持框架之Groovy脚本加载执行

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文件添加依赖
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-all</artifactId>
<version>2.4.3</version>
</dependency>
2. 加载Groovy
直接利用上面jar包中提供的GroovyCalssLoader来加载Groovy文件即可,使用也比较简单
@Slf4j
public class GroovyCompile {
@SuppressWarnings("unchecked")
public static <T> T compile(File codeSource, Class<T> interfaceType, ClassLoader classLoader)
throws CompileTaskScriptException {
try {
GroovyClassLoader loader = new GroovyClassLoader(classLoader);
Class clz = loader.parseClass(codeSource);
// 接口校验
if (!interfaceType.isAssignableFrom(clz)) {
throw new CompileTaskScriptException("illegal script type!");
}
return (T) clz.newInstance();
} catch (IOException e) {
log.error("load code from {} error! e: {}", codeSource, e);
throw new CompileTaskScriptException("load code from " + codeSource + " error!");
} catch (CompileTaskScriptException e) {
throw e;
} catch (Exception e) {
log.error("initial script error! codePath: {}, e: {}", codeSource, e);
throw new CompileTaskScriptException(
"initial script error! clz: " + codeSource + " msg: " + e.getMessage());
}
}
}
上面看着挺多,关键地方就三行,编译为class对象之后,借助反射来创建对象
GroovyClassLoader loader = new GroovyClassLoader(classLoader);
Class clz = loader.parseClass(codeSource);
return (T) clz.newInstance();
另外还有一行,也可以顺带凑一眼,判断一个class是否为另一个class的子类,用的是
interfaceType.isAssignableFrom(clz)
而判断某个对象是否为某类的子类用的则是 instance of
3. 调用包装
上面既然提供了一个工具类,那么接上篇的获取变动文件之后,获取File对象,借此拿到任务对象,就比较清晰了
@Slf4j
public class ScriptLoadUtil {
public static ITask loadScript(File file) {
try {
return GroovyCompile.compile(file, ITask.class, ScriptLoadUtil.class.getClassLoader());
} catch (CompileTaskScriptException e) {
log.error("un-expect error! e: {}", e);
return null;
}
}
}
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&公众号

知识星球

180807-Quick-Task 动态脚本支持框架之Groovy脚本加载执行的更多相关文章
- 180723-Quick-Task 动态脚本支持框架之结构设计篇
文章链接:https://liuyueyi.github.io/hexblog/2018/07/23/180723-Quick-Task-动态脚本支持框架之结构设计篇/ Quick-Task 动态脚本 ...
- 180719-Quick-Task 动态脚本支持框架之使用介绍篇
文章链接:https://liuyueyi.github.io/hexblog/2018/07/19/180719-Quick-Task-动态脚本支持框架之使用介绍篇/ Quick-Task 动态脚本 ...
- 180729-Quick-Task 动态脚本支持框架之任务动态加载
Quick-Task 动态脚本支持框架之任务动态加载 前面几篇博文分别介绍了整个项目的基本架构,使用说明,以及整体框架的设计与实现初稿,接下来则进入更细节的实现篇,将整个工程中核心实现捞出来,从为什么 ...
- JS脚本文件的位置对页面加载性能影响以及无阻塞脚本(javascript)模式
JS的阻塞特性:当<script>出现的时候,页面必须等待脚本文件的加载.解析.执行完毕后才能继续进行页面的渲染.不管脚本文件是以内联形式还是外部引入的形式出现在<script> ...
- 001_Chrome 76支持原生HTML 图片懒加载Lazy loading
Table Of Content 什么是懒加载? 语法参数及使用方式? 有哪些特点? 与js有关的实践 什么是懒加载? 技术背景 Web应用需要经常向后台服务器请求资源(通过查询数据库,是非常耗时耗资 ...
- Yaf框架下类的自动加载
前面两篇博客分别讲述了PHP自带的类加载和composer中类的自动加载,其实Yaf框架也实现了基于PSR0和PSR4的类的自动加载.根据我对Yaf下类的自动加载方式的理解写下这篇博客.由于接触Yaf ...
- layui树形表格支持非异步和异步加载
layui树形表格支持非异步和异步加载. 仓库地址:https://gitee.com/uniqid/ 使用示例如下: <div class="uui-admin-common-bod ...
- flask模板应用-加载静态文件:添加Favicon,使用CSS框架,使用宏加载静态资源
加载静态文件 一个Web项目不仅需要HTML模板,还需要许多静态文件,比如CSS.JavaScript文件.图片和声音声.在flask程序中,默认需要将静态文件存储在与主脚本(包含程序实例的脚本)同级 ...
- Android批量图片加载经典系列——使用xutil框架缓存、异步加载网络图片
一.问题描述 为提高图片加载的效率,需要对图片的采用缓存和异步加载策略,编码相对比较复杂,实际上有一些优秀的框架提供了解决方案,比如近期在git上比较活跃的xutil框架 Xutil框架提供了四大模块 ...
随机推荐
- notepad快捷键大全
Notepad++ 快捷键 大全Ctrl+C 复制Ctrl+X 剪切Ctrl+V 粘贴Ctrl+Z 撤消Ctrl+Y 恢复Ctrl+A 全选Ctrl+F 键查找对话框启动Ctrl+H 查找/替换对话框 ...
- debug的粗略使用(求大神们补充、指教,小渣马上改)
debug的使用 往往我们在写代码的时候会发现那种很隐秘的bug,一直找找不多,甚至开始怀疑人生.目光扫描和人脑编译又耗时又耗精力又很容易中途乱了脑子,一切得重新来,所以我写了一篇博客来模拟一下检查b ...
- 第2次作业——APP案例分析
第一部分 调研, 评测 1.下载软件并使用起来,描述最简单直观的个人第一次上手体验. 知乎,中文互联网最大的知识平台.使用知乎这个APP3年了,目睹了它的兴盛(当然没有衰亡@_@).打开这款APP,主 ...
- 021.14 IO流 管道流
用的频率不高特点:读取管道和写入管道对接,需要是用多线程技术,单线程容易死锁 使用connect方法连接两个流,实现边读编写,和node.js的管道流差不多 //##主函数位置 public stat ...
- 根据需求设计类并且画UML类图练习
题目如下: // 打车时,可以打专车或者快车.任何车都有车牌号和名称// 不同车价格不同,快车每公里1元,专车每公里2元// 行程开始时,显示车辆信息// 行程结束时,显示打车金额(假定行程就5公里) ...
- SharePoint 改动passwordWeb Part部署方案
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/u012025054/article/details/31773231 SharePoint 改动pa ...
- 1040. [ZJOI2008]骑士【树形DP】
Description Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各 界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战 ...
- Day1 Mybatis初识(一)
框架 将重复的,繁琐的代码实现封装,让程序员将更多的精力放在业务的理解和分析上. 框架的作用 提高开发效率 隐藏细节 三大框架SSH --> SSM 1) 表述层: 用户 ...
- centos7 tengine 安装
Tengine是由淘宝网发起的Web服务器项目.它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性.Tengine的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了很好的检 ...
- 多线程之并发容器ConcurrentHashMap
这部分内容转载自: http://www.haogongju.net/art/2350374 JDK5中添加了新的concurrent包,相对同步容器而言,并发容器通过一些机制改进了并发性能.因为同步 ...