1. 程式人生 > >關於Java定時器的一些理解

關於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);

並且建立定時任務