加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-14 16:39:24 所属栏目:大数据 来源:网络整理
导读:起因 项目上有用到文件解析的功能,一个txt对账文件,逐行读取数据并处理落库。不同的渠道,其文件内容、格式等差异可能较大,落库及后续处理方式也或许不同。虽然目前使用了策略模式以求保持流畅上的一致,但每次新加的代码量还是颇多。 措施 将解析功能模

起因

项目上有用到文件解析的功能,一个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<FileParserDetail> 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();

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读