利用Groovy加載器動態實現文件解析

原由

項目上有用到文件解析的功能,一個txt對帳文件,逐行讀取數據並處理落庫。不一樣的渠道,其文件內容、格式等差別可能較大,落庫及後續處理方式也或許不一樣。雖然目前使用了策略模式以求保持流暢上的一致,但每次新加的代碼量仍是頗多。數據庫

措施

將解析功能模塊化,獨立於業務流程
利用Groovy的加載器,加載外部腳本(該腳本放在數據庫中)ide

類圖

圖片描述

說明

  • 功能觸發後(目前爲定時任務驅動),從配置表獲取須要解析的對象信息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();
相關文章
相關標籤/搜索