关于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);

并且创建定时任务

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值