总有话要说在前头
不管是做电子商务平台还是其他的什么系统,只要涉及到订单就肯定有订单超时自动失效的功能。本篇文章将使用quartz初步解决这个问题。
在数据量较小的情况,我们可以采用quartz定时执行任务。比如设置订单20min未接单则修改订单的status。
1.导入相应的jar包
2.编写Job接口实现类以及监听器
实现类代码如下:
package quartz;
import dao.impl.OrderDaoImpl;
import entity.Order;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import util.Constant;
import util.TimeUtil;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
/**
* Created by zipple on 2017/10/24.
*/
public class OrderJob implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
//10min查一下数据库
OrderDaoImpl orderDao = new OrderDaoImpl();
List<Order> orderList=orderDao.getOrdersByStatus(Constant.WAITING);
for (Order order:orderList) {
if (TimeUtil.minuteDiff(order.getCreatedAt(),new Date())>20){
order.setStatus(Constant.TIMEOUT);
orderDao.upd(order);//更改为失效
System.out.println("id为"+order.getId()+"的订单失效");
}
}
}
}
我们在监听器中设置cron时间:
package listener;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
import quartz.DemoJob;
import quartz.OrderJob;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
/**
* Created by zipple on 2017/10/24.
*/
public class OrderJobListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
//启动tomcat时自动维持自定义的quartz监听
JobDetail jobDetail = JobBuilder.newJob(OrderJob.class).withIdentity("orderJob","group1").build();
try {
Trigger trigger = TriggerBuilder
.newTrigger()
.withIdentity("orderJob", "group1")
.withSchedule(
CronScheduleBuilder.cronSchedule("0 0/10 * * * ?"))//更改时间
.build();
Scheduler scheduler = new StdSchedulerFactory().getScheduler();
scheduler.start();
scheduler.scheduleJob(jobDetail, trigger);
} catch (SchedulerException e) {
e.printStackTrace();
}
}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
System.out.println("销毁定时调度监听器");
}
}
在数据量大的情况下保持10min中轮询可能会消耗许多资源,我也一直在寻找新的方法来解决这个问题。原本的思想是添加一个新订单的时候把相应的订单id传递给监听器延时20min检查订单状态…可是自定义监听器这块不太熟,等以后状态好些了再试试吧。这几天完全没有敲代码的状态了。。。。颓废