最近公司有一个需求发现用neptune实现起来非常清新爽洁不紧绷 需求是这样 需要从某公司下载大量的数据文件 一共有十八种不同的文件比如CustomerCompany StockIndex等等 从年月一直到现在每个工作日都有数据文件下载周末没有 对某一天比如//的Customer文件url的格式是 开始需要把所有历史文件下载下来 然后每天都持续下载新文件 在给定的某一天不一定每个文件都有有时候Customer没有或者Company没有理论上可以每个文件都没有 下载下来的文件需要unzipunzip出来的会是一个csv文件 这个csv文件需要被输入到数据库中的对应表中这一天的日期也要存在这个表里作为一个列也就是说Customer Company这些表除了有这些数据文件里面的每一个field之外还有一个date列来表示这个纪录是哪一天的 下面是一些思考 因为一个文件可能也可能不存在所以这个文件不存在不能让整个流程停下来文件不存在我们需要停止接下来的对这个文件的解压和导入数据库但是不能中断其他文件的下载 因为从别的公司下载也无法保证敌人给我们的文件永远格式正确如果万一解压失败或者导入数据库失败也能终端整个任务 文件需要下载到本地目录里面因为不同日期的文件名字一样所以我们本地也可以构建一个yyyy/mm/dd格式的目录树 一个一个文件下载解压导入非常没有效率也许敌人的网络很慢这样整个任务就会持续太长时间最好的办法是能够并行同时处理多个文件 持续更新的时候不能简单地只使用当前日期因为也许因为某些原因前一天的某个文件没有及时更新或者下载失败了之类的为了保证程序的健壮性我们最好是从数据库读取最新日期那一天的下一天就是我们要开始处理的日期 下载解压调用数据库这些基本动作都可以用ant的任务来实现 导入数据库我们用一个存储过程实现
好下面让我们从头构建这个任务 下载 download srcfile zipfile = antget{src=srcfiledest=zipfileusername=myuser password=mypwdusetimestamp=trueverbose=false}; 解压 unzip zipfile destdir = antunzip{src=zipfile dest=destdir}; 导入数据库 importFile date name = antsql(db_connection)with[ exec loadDataFile ${destdir} ${datestr} ${name}]where datestr = datepath date; destdir = $csvroot/$datestr;end; 导入数据库这一步用到了几个辅助函数和变量 datepath函数负责把一个javautilDate对象转换成yyyy/MM/dd格式的字符串它使用jaskell的内建函数format datepath date = jaskelldatesformat{pattern=yyyy/MM/dd} date; db_connection是一个储存着所有数据库连接相关信息的对象 csvroot是储存所有csv文件的根目录 |