關於Java定時器的一些理解
在做公司的一個專案的時候,有一個模組是團購。有這樣的需求,參與團購人數到達團購人數時則團購成功,否則當活動時間結束後團購失敗。這裡涉及到團購失敗後的退款問題。我也是第一次做這樣的需求,一開始並不知道如何下手。後來想到利用定時器去解決。因為訂單是關聯活動的id的,這樣活動id不會變。在定時任務執行是查詢活動的id相關聯的訂單進行退款操作。
貼程式碼
//釋出定時任務讓超時拼團狀態修改為失敗
Timetask tt=new Timetask();//查詢條件
tt.setSpellgroupid(id);
Timetask t=timetaskService.get(tt);
if(t==null){//如果沒有任務就建立,有無需操作
final Timer time=new Timer();
Date endDate = spellGroup.getEnddate();
TimerTask timertask=new TimerTask() {
@Override
public void run() {
SgSponsor bySponsor=new SgSponsor();
bySponsor.setSpellgroupid(id);
bySponsor.setSpellstatus(0);
List<SgSponsor> findlist = sgSponsorService.findList(bySponsor);
for(SgSponsor b:findlist){
b.setSpellstatus(2);//修改為拼團失敗
sgSponsorService.save(b);
String[] split = b.getOrderids().split(",");
try {
for(String s:split){
ByGoodsOrder byGoodsOrder = byGoodsOrderService.get(s);
//退款操作
String transaction_id=byGoodsOrder.getTransactionId();
String out_refund_no=byGoodsOrder.getOrderNum();
int total_fee=(int) (byGoodsOrder.getPayMoney()*100);
int refund_fee=(int) (byGoodsOrder.getPayMoney()*100);
Refund.spellgroupRefund(transaction_id, out_refund_no, total_fee, refund_fee);
byGoodsOrder.setOrderstatus("4");//拼團失敗
byGoodsOrder.setOrderTime(new Date());
byGoodsOrderService.save(byGoodsOrder);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
time.cancel();
}
};
Timetaskutil.timeTask(timertask, endDate,time);
//插入資訊到任務標識表
Timetask ttask=new Timetask(UUID.randomUUID().toString().replace("-", ""), id);
timetaskService.insert(ttask);
}
邏輯上是使用者進活動詳情
去查詢資料庫的定時任務表有沒有該活動的資料(實際上就是一個標誌)
如果沒有的話就建立一條相關資料庫記錄
Timetask ttask=new Timetask(UUID.randomUUID().toString().replace("-", ""), id);
timetaskService.insert(ttask);
並且建立定時任務