最近公司有一個需求發現用neptune實現起來非常清新爽潔不緊繃
需求是這樣
需要從某公司下載大量的數據文件
一共有十八種不同的文件
比如Customer
Company
StockIndex等等
從
年
月一直到現在
每個工作日都有數據文件下載
周末沒有
對某一天
比如
/
/
的Customer文件
url的格式是
開始需要把所有歷史文件下載下來
然後每天都持續下載新文件
在給定的某一天
不一定每個文件都有
有時候Customer沒有
或者Company沒有
理論上
可以每個文件都沒有
下載下來的文件需要unzip
unzip出來的會是一個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函數負責把一個java
util
Date對象轉換成
yyyy/MM/dd
格式的字符串
它使用jaskell的內建函數format
datepath date = jaskelldatesformat{pattern=yyyy/MM/dd} date;
db_connection是一個儲存著所有數據庫連接相關信息的對象
csvroot是儲存所有csv文件的根目錄
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26191.html