资讯专栏INFORMATION COLUMN

利用Groovy加载器动态实现文件解析

siberiawolf / 1667人阅读

摘要:措施将解析功能模块化,独立于业务流程利用的加载器,加载外部脚本该脚本放在数据库中类图说明功能触发后目前为定时任务驱动,从配置表获取需要解析的对象信息,根据配置选择相应的解析器实现类接口实现解析文件的功能。

起因

项目上有用到文件解析的功能,一个txt对账文件,逐行读取数据并处理落库。不同的渠道,其文件内容、格式等差异可能较大,落库及后续处理方式也或许不同。虽然目前使用了策略模式以求保持流畅上的一致,但每次新加的代码量还是颇多。

措施

将解析功能模块化,独立于业务流程
利用Groovy的加载器,加载外部脚本(该脚本放在数据库中)

类图

说明

功能触发后(目前为定时任务驱动),从配置表获取需要解析的对象信息FileParserConfig,根据配置选择相应的解析器实现类

FileParserService接口实现解析文件的功能。

AbstractFileParserService为抽象实现类,处理需逐行解析的文件

@Override
public void parserFile(FileParserConfig config) throws Exception {
    try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(config.getSourceFile()));
        BufferedReader in = new BufferedReader(new InputStreamReader(bis, "GBK"), 100 * 1024 * 1024);) {
        List bufferList = new ArrayList<>(8092);

        FileParser parser = parserScriptEngine.loadScriptParserByKey(config.getTradeType(), config.getFundChannel(),
                config.getExtraType());
        while (in.ready()) {
            String line = in.readLine();

            FileParserDetail bill = parser.parserFile(line);
            if (bufferList.size() == 8092) {
                this.saveDetail(bufferList);
                bufferList = new ArrayList<>(8092);
            }
            bufferList.add(bill);
        }

        this.saveDetail(bufferList);
    }
}

A-ChannelFileParserServiceImpl为实现类,实现saveDetail方法,控制Dao操作(此处基于Dao层予以提供实现类)

ParserScriptEngine加载Groovy脚本,脚本需要实现接口FileParser

return (FileParser) groovyClassLoader.parseClass(script).newInstance();

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

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

相关文章

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

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

    suemi 评论0 收藏0
  • JAVA 虚拟机类加载机制和字节码执行引擎

    摘要:实现这个口号的就是可以运行在不同平台上的虚拟机和与平台无关的字节码。类加载过程加载加载是类加载的第一个阶段,虚拟机要完成以下三个过程通过类的全限定名获取定义此类的二进制字节流。验证目的是确保文件字节流信息符合虚拟机的要求。 引言 我们知道java代码编译后生成的是字节码,那虚拟机是如何加载这些class字节码文件的呢?加载之后又是如何进行方法调用的呢? 一 类文件结构 无关性基石 ja...

    RichardXG 评论0 收藏0
  • 深入字节码 -- 计算方法执行时间

    摘要:什么是字节码程序通过编译之后生成文件就是字节码集合正是有这样一种中间码字节码,使得等函数语言只用实现一个编译器即可运行在上。 什么是字节码? java程序通过javac编译之后生成文件.class就是字节码集合,正是有这样一种中间码(字节码),使得scala/groovy/clojure等函数语言只用实现一个编译器即可运行在JVM上。看看一段简单代码。 public long ...

    娣辩孩 评论0 收藏0

发表评论

0条评论

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