资讯专栏INFORMATION COLUMN

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

suemi / 1174人阅读

摘要:动态脚本支持框架之脚本加载执行上一篇简答说了如何判断有任务动态添加删除或更新,归于一点就是监听文件的变化,判断目录下的文件是否有新增删除和改变,从而判定是否有任务的变更接下来的问题就比较明显了,当任务变更之后,就需要重新加载任务了,即如何

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文件添加依赖


    org.codehaus.groovy
    groovy-all
    2.4.3
2. 加载Groovy

直接利用上面jar包中提供的GroovyCalssLoader来加载Groovy文件即可,使用也比较简单

@Slf4j
public class GroovyCompile {

    @SuppressWarnings("unchecked")
    public static  T compile(File codeSource, Class 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 动态脚本支持框架之任务动态加载

项目:

https://github.com/liuyueyi/quick-task

1. 一灰灰Blog: https://liuyueyi.github.io/he...

一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛

2. 声明

尽信书则不如,已上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激

微博地址: 小灰灰Blog

QQ: 一灰灰/3302797840

3. 扫描关注

小灰灰Blog&公众号

知识星球

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/76649.html

相关文章

  • 180723-Quick-Task 动态脚本支持框架结构设计篇

    摘要:动态脚本支持框架之结构设计篇相关博文动态脚本支持框架整体介绍篇动态脚本支持框架之使用介绍篇前面两篇博文,主要是整体介绍和如何使用接下来开始进入正题,逐步剖析,这个项目是怎么一步一步搭建起来的本篇博文则主要介绍基本骨架的设计,围绕项目 showImg(https://segmentfault.com/img/remote/1460000015739044); Quick-Task 动态脚...

    Ashin 评论0 收藏0
  • 180719-Quick-Task 动态脚本支持框架使用介绍篇

    摘要:文章链接动态脚本支持框架之使用介绍篇动态脚本支持框架之使用介绍篇相关博文动态脚本支持框架整体介绍篇这个项目主要就是为了解决数据订正和接口验证不方便的场景,设计的一个及其简单的动态脚本调度框架,前面一篇整体介绍篇博文,主要介绍了这是 showImg(https://segmentfault.com/img/remote/1460000015698572); 文章链接:https://li...

    shiina 评论0 收藏0
  • 利用Groovy加载动态实现文件解析

    摘要:措施将解析功能模块化,独立于业务流程利用的加载器,加载外部脚本该脚本放在数据库中类图说明功能触发后目前为定时任务驱动,从配置表获取需要解析的对象信息,根据配置选择相应的解析器实现类接口实现解析文件的功能。 起因 项目上有用到文件解析的功能,一个txt对账文件,逐行读取数据并处理落库。不同的渠道,其文件内容、格式等差异可能较大,落库及后续处理方式也或许不同。虽然目前使用了策略模式以求保持...

    siberiawolf 评论0 收藏0
  • Java动态编程初探

    摘要:动态编程使用场景通过配置生成代码,减少重复编码,降低维护成本。动态生成字节码操作字节码的工具有,其中有两个比较流行的,一个是,一个是。 作者简介 传恒,一个喜欢摄影和旅游的软件工程师,先后从事饿了么物流蜂鸟自配送和蜂鸟众包的开发,现在转战 Java,目前负责物流策略组分流相关业务的开发。 什么是动态编程 动态编程是相对于静态编程而言的,平时我们讨论比较多的静态编程语言例如Java, 与动态...

    赵连江 评论0 收藏0
  • java开发程序员需要用到的库和框架有哪些

    摘要:框架是和应用程序的另一个测试和规范框架。它是为应用程序编写自动测试的最有用的库之一。数据库是许多应用程序包括核心和应用程序不可分割的一部分,可能是进行单元测试时的最大障碍。 作为一名Java开发人员,我们从事不同的领域,从编写核心Java代码到创建JSP页面、编写RESTAPI,有时甚至创建Groovy脚本以实现构建自动化...

    zhaochunqi 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<