糖葫芦娃哈哈 2019-06-25
项目上有用到文件解析的功能,一个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脚本,脚本需要实现接口FileParserreturn (FileParser) groovyClassLoader.parseClass(script).newInstance();