通過URL接口定時讀取其返回的xml(可存入數據庫)

之前都是直接讀取xml文件的,可是這次做東西對方只提供一個URL返回xml,我需要定時讀取。
解決方案:
1:通過URL和URLConnection來解析改URL,使其返回inputstream
2:用dom4j解析該inputstream,將解析的數據封裝成需要的對象,來存入一個List或Map
3:定義一個Controller來執行該過程
4:用crontab來執行定時任務(linux下,執行crontab -e進行編輯)

@Get("/load")
public String loadDataFromXmlByDate(Invocation inv, @Param("begin") Date datebegin,
@Param("end") Date dateend) {
String begin = DateTimeUtil.getFormatDateTime(datebegin, "yyyyMMdd");
String end = DateTimeUtil.getFormatDateTime(dateend, "yyyyMMdd");
// String ip = inv.getRequest().getRemoteAddr();
String URL = WbConstant.URL + WbConstant.URL_DATE_BEGIN + begin
+ WbConstant.URL_DATE_END + end;
List<Statistic> stats = parseXML(URL);
for (int i = 0; i < stats.size(); i++) {
Statistic st = stats.get(i);
st.setTime(datebegin);
//通過service層來執行邏輯並存儲到DB
IResult result = dataService.createStatistic(st);
if (result.isSuccess()) {
if (logger.isInfoEnabled()) {
logger.info("insert data into db from xml success");
}
} else {
if (logger.isInfoEnabled()) {
logger.info(result.getResult("error").toString());
}
}
}
return "ok";
}
/**
* 加載默認日期的xml
* @param inv
* @return
*/
@Get("/loadDefault")
public String defaultLoadDateFromXml(Invocation inv) {
Date today = new Date();
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE, -1);
Date yesterday = cal.getTime();
return loadDataFromXmlByDate(inv, yesterday, today);
}

private List<Statistic> parseXML(String URL) {
long beginTime = System.currentTimeMillis();
List<Statistic> xmlList = new ArrayList<Statistic>();
SAXReader reader = new SAXReader();
URL url = null;
try {
url = new URL(URL);
} catch (MalformedURLException e) {
logger.error("給定的URL生成錯誤", e);
}
try {
URLConnection urlConnection = url.openConnection();
InputStream urlIn = urlConnection.getInputStream();
doc = reader.read(urlIn);
} catch (IOException e) {
logger.error("IOException:通過URL-openConnection-getInputStream時,錯誤",
e);
} catch (DocumentException e) {
logger.error("DocumentExcepion:SAXReader解析inputsream爲Document時,錯誤",
e);
}
Element root = doc.getRootElement();
for (Iterator<Element> it = root.elementIterator(); it.hasNext();) {
Element e = (Element) it.next();
String date = e.elementText("date");
String pid = e.elementText("pid");
String data = e.elementText("data");
//封裝數據爲對象
Statistic stat = new Statistic();
stat.setHomeCount(Integer.parseInt(data));
stat.setPid(pid);
stat.setTime(DateTimeUtil.getFormatDate(date));
xmlList.add(stat);
}
long endTime = System.currentTimeMillis();
System.out.println("共花費時間爲" + (endTime - beginTime) + "ms");
return xmlList;
}

上面的controller寫完了,就可以用crontab來執行定時任務了,該controllerURL爲,xxx.com/loadDefault則,定爲每天下午2點鐘執行一次如下
00 14 * * * wget -a /data/logs/wb/xml.log http://xxx.com/loadDefault
OK了,可以了
發佈了21 篇原創文章 · 獲贊 3 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章