利用Groovy加载器动态实现文件解析
起因
项目上有用到文件解析的功能,一个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();
相关推荐
软件的信雅达 2020-11-02
糖葫芦娃哈哈 2020-11-02
淡茶 2020-05-10
PHP学习笔记 2020-03-06
anvien 2020-01-08
quzhongwei 2020-01-06
淡茶 2020-01-03
tysforwork 2019-12-12
简单点好 2013-09-04
PeterHao0 2013-08-31
软件的信雅达 2019-11-19
软件的信雅达 2017-02-11
yiyilanmei 2015-04-28
无聊找点事做 2019-09-06
HaleyJenkins 2016-10-18
PeterHao0 2016-01-22
dieefer 2017-02-11
liushidexing 2016-11-03
春天花会开 2016-11-01