电子商务平台自动取消失效订单

任务需求:

  关闭超时未支付的订单,将订单信息置为失效状态

相关技术:

  quartz框架定时调度

实现思路:

  1.   在服务启动时,查询数据库中的已下单未支付的订单数据,按下单时间先后存入队列中,先下单的存到头不,后下单存入队列尾部,取队列的头元素
  2.   检测与现在的时间,如果超过40分钟,则执行数据操作,即关闭订单,但是只关闭未支付的订单,之后在将头元素从队列移出,并取出下一个元素进行检测,以此类推
  3.   如果检测出时间未到40分钟,则线程等待相应的时间差,之后在执行订单操作

相关问题:

  1.   在执行时要防止轮询任务追尾,即在上一个job未执行完毕时就开始下一次轮询,解决方法是在job上加@DisallowConcurrentExecution注解,该注解的作用是让下一次job要等待当前job执行完毕
  2.   设置的轮询间隔是35分钟一次,订单超时是4分钟,中间有5分钟的时间差,为了防止订单被多次加入队列中,在加入订单队列时要注意去重

相关代码

package com.ichunshen.dolook.module.trade.order.support;

import static org.quartz.CronScheduleBuilder.cronSchedule;
import static org.quartz.JobBuilder.newJob;
import static org.quartz.TriggerBuilder.newTrigger;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import org.apache.log4j.Logger;
import org.quartz.CronTrigger;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.impl.StdSchedulerFactory;

import com.ichunshen.dolook.module.trade.order.job.CancelOrderJob;
import com.ichunshen.dolook.module.trade.order.model.Order;
import com.ichunshen.dolook.module.trade.order.web.OrderController;

public class CancelOrderTask {

    static Logger logger = Logger.getLogger(OrderController.class);

    public void cancelOrderTask() throws SchedulerException { // 获得一个scheduler
        SchedulerFactory sh = new StdSchedulerFactory();
        Scheduler scheduler = sh.getScheduler();

        // 创建一个job 任务名,任务组,任务执行类
        JobDetail job = newJob(CancelOrderJob.class).withIdentity("cancelOrderJob", "orderJob").build();

        //创建一个触发器
        CronTrigger trigger = newTrigger().withIdentity("cancelOrderTrigger", "orderTrigger")
                .withSchedule(cronSchedule("0 0/2 * * * ?")).build();
        //将job和触发器绑定
        Date date=scheduler.scheduleJob(job, trigger);

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");
        logger.info(job.getKey()+"取消订单定时任务于"+sdf.format(date)+"开始执行");

        scheduler.start();
    }

}
package com.ichunshen.dolook.module.trade.order.job;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import org.apache.log4j.Logger;
import org.quartz.DisallowConcurrentExecution;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.PersistJobDataAfterExecution;
import org.quartz.StatefulJob;

import com.ichunshen.dolook.module.trade.order.model.Order;
import com.ichunshen.dolook.module.trade.order.service.OrderService;
import com.ichunshen.dolook.module.trade.order.support.OrderQueue;
import com.ichunshen.dolook.support.DoLookConstant.OrderCancelMethod;

import cn.joy.framework.plugin.quartz.ScheduleTask;
/**
 * quartz任务的job,用于检测数据库失效订单并将其关闭
 * @author wangpeiqing
 *
 */
@DisallowConcurrentExecution
public class CancelOrderJob implements ScheduleTask {
    Logger logger=Logger.getLogger(CancelOrderJob.class);

    @Override
    public void execute(JobExecutionContext arg0) throws JobExecutionException {
        // TODO Auto-generated method stub
        System.out.println("失效订单检测任务开始执行!");
        Order order =new Order();
        OrderQueue queue = new OrderQueue();

        //在每次启动Job时去数据库查找失效订单,并加入到队列中
        List<Order> list=order.getInvalidOrder();
        if(!list.isEmpty()){
            for (Order o : list) {
                queue.offer(o);
            }
        }
        //获取队列的头元素,开始检测头订单是否失效
        Order element=queue.peek();
        while (element!=null) {
            Long time=this.checkOrder(element);
            if (time != null && time >=2400*1000) {
                System.out.println("开始关闭订单"+element.getOcode()+"下单时间"+element.getOrderTime());
                element.cancelInvalidOrderStatus(element.getOcode(), OrderCancelMethod.INVALID_TIME);
                queue.poll();
                element=queue.peek();
            }else if(time<2400*1000){
                try {
                    System.out.println("等待检测订单"+element.getOcode()+"下单时间"+element.getOrderTime()+"已下单"+time/1000+"秒");
                    Thread.sleep(time);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                    logger.info("CancelOrderJob.checkOrder定时任务出现问题");
                }
            }
        }
    }
    /**
     * 获取订单的下单时间和现在的时间差
     * @author wangpeiqing
     * 2016年4月16日
     * @param order
     * @return
     *
     */
    public Long checkOrder(Order order) {
        Date date = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        OrderQueue queue = new OrderQueue();
        Long diff = null;
        if (order != null) {
            Date orderTime = order.getOrderTime();
            try {
                diff = sdf.parse(sdf.format(date)).getTime() - sdf.parse(sdf.format(orderTime)).getTime();
            } catch (ParseException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        //返回值为毫秒
        return diff;
    }

}
package com.ichunshen.dolook.module.trade.order.support;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import org.quartz.SchedulerException;

public class CancelOrderListener implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        // TODO Auto-generated method stub
        CancelOrderTask task = new CancelOrderTask();
        try {
            task.cancelOrderTask();
        } catch (SchedulerException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        // TODO Auto-generated method stub

    }

}
时间: 2024-10-09 11:02:52

电子商务平台自动取消失效订单的相关文章

jquery实现前台倒计时。应用下单24小时后自动取消该订单

<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> <script type="text/javascript" src="jquery-1.7.2.min.js"></script> <title>testc</title> &l

高并发电子商务平台技术架构

原文出自:http://blog.csdn.net/yangbutao/article/details/12242441 http://stamen.iteye.com/blog/1525924 我自己的大型B2B和B2C站点原来也是用Hibernate,可是后来不得不换成mybatis, 第一是用Hibernate 因为它封装得太高了.非常多东西是隐式进行的.常常引起问题,非常难定位.毕竟凡事有利必有弊: 第二大型站点肯定不是一个数据库.这点Hibernate是非常麻烦的,用Jdbc或Myba

生活中的第三方电子商务平台

生活中的第三方电子商务平台 --安阳师范学院互联网+应用技术学院跨境营销与策划方向 屠倩莹第三方电子商务平台在我们的生活中无处不在,下面我主要讲解几个在我们生活中常用到的几个第三方电子商务平台:阿里巴巴阿里巴巴全称阿里巴巴网络技术有限公司(简称:阿里巴巴集团)是以曾担任英语教师的马云为首的18人,于1999年在杭州创立,他们相信互联网能够创造公平的竞争环境,让小企业通过创新与科技扩展业务,并在参与国内或全球市场竞争时处于更有利的位置.公司使命为:让天下没有难做的生意.阿里巴巴创始人马云觉得世界各

Java生鲜电商平台-高并发核心技术订单与库存实战

Java生鲜电商平台-高并发核心技术订单与库存实战 一. 问题 一件商品只有100个库存,现在有1000或者更多的用户来购买,每个用户计划同时购买1个到几个不等商品. 如何保证库存在高并发的场景下是安全的? (1)不多发 (2)不少发 二. 下单的步骤 (1)下单 (2)下单同时预占库存 (3)支付 (4)支付成功真正减扣库存 (5)取消订单 (6)回退预占库存 三. 什么时候进行预占库存? (1)方案一:加入购物车的时候去预占库存 (2)方案二:下单的时候去预占库存 (3)方案三:支付的时候去

打造独一无二的电子商务平台-鸿鹄云商b2b b2c o2o

鸿鹄云商是大型企业分布式互联网电子商务平台,国内首家推出PC+微信+APP+云服务的云商平台系统,其中包括B2B.B2C.C2C.O2O.新零售.直播电商等子平台.打通线上线下渠道,构建一个健康且可持续发展的企业生态系统. 鸿鹄云商互联网+涉及行业包括:智慧农业.智慧商店.智慧社区.工业互联网应用.跨境电商.生鲜食品行业.商业零售.互联网金融.房地产.汽车市场.健康.珠宝.餐饮娱乐.服装等多个领域. 鸿鹄云商结合了当前大部分企业的通用需求,包括技术的选型比较严格.苛刻,不仅要用业界最流行的技术,

线下线上对接的一种思路(本地erp与线上电子商务平台对接)

目前很多公司都希望本地的ERP能够与线上的电子商务平台进行对接. 但是很多的线下ERP系统商不愿意修改代码来做相应的对接,或者觉得太话费成本. 而对于企业本身,又会有很多的特殊需求. 下面略述一家进口商品企业的线上线下整合方案. 线下系统使用深圳思迅的门店管理系统,使用VS.Net平台开发,数据库使用MSQL2005,BS结构(内部管理用)+CS结构(门店POS开单),局域网部署 线上系统使用本地的一家电子商务平台提供商的商城系统(通过该平台,让分销商可以直接采购下单,查询库存,以及及时下载最新

电子商务平台需求建议书应包括的关键问题(一)

hybris软件公司全方位商务洞察系列 电子商务平台需求建议书应包括的关键问题(一) 问:Hybris的平台是否可为多渠道商务提供基础?它是否可以与其他系统(内部或第三方)集成从而实现全渠道商务? 答:寻找答案 公司应该寻找已预先集成了众多的第三方解决方案的电子商务平台.最好的平台能与多种第三方应用程序集成,并能提供强大的 API 与其他内部系统集成.这些功能可让电子商务平台用作全渠道商务的基础.要寻找的关键系统集成包括订单管理系统 (OMS).产品信息管理系统 (PIM) 及企业资源规划系统

专业C2C电子商务平台推荐

在过去的几年中,中国的电子商务正以前所未有的速度迅猛发展着.不仅改变着我们的传统生产方式,而且也对经济结构的调整产生深刻的影响.在电子商务的运营模式中, C2C模式由于其用户参与性强.灵活方便等特点,逐渐表现出较强的发展潜力.C2C电子商务平台就是通过为买卖双方提供一个在线交易平台,其中,客户是C2C电子商务平台获得企业利润和竞争优势的重要资源,C2C模式成功的关键在于分析客户的个性需求,进行有效地客户管理关系,从而提高客户的满意度和忠诚度. C2C电子商务平台的分类有综合型C2C.垂直型C2C

互联网电子商务平台-b2b b2c o2o

是大型企业分布式互联网电子商务平台,国内首家推出PC+微信+APP+云服务的云商平台系统,其中包括B2B.B2C.C2C.O2O.新零售.直播电商等子平台.打通线上线下渠道,构建一个健康且可持续发展的企业生态系统.    互联网+涉及行业包括:智慧农业.智慧商店.智慧社区.工业互联网应用.跨境电商.生鲜食品行业.商业零售.互联网金融.房地产.汽车市场.健康.珠宝.餐饮娱乐.服装等多个领域.    结合了当前大部分企业的通用需求,包括技术的选型比较严格.苛刻,不仅要用业界最流行的技术,还要和国际接