1.以下是在servlet3.0中实现自动删除订单功能
package net.wxcms.koubeichi.listener;
import java.util.TimerTask;
import javax.servlet.ServletContext;
import net.wxcms.koubeichi.dao.OrderDao;
/*
* 自动删除订单
*/
public class OrderDelTask extends TimerTask{
private static boolean isRunning = false;
private ServletContext context = null;
public OrderDelTask() {
}
public OrderDelTask(ServletContext context) {
this.context = context;
}
public void run() {
if (!isRunning) {
isRunning = true;
OrderDao.delBatch();//定时执行的sql(删除订单的sql)
isRunning = false;
}
else {
context.log("OrderTask上一次任务执行还未结束");
}
}
}
2.dao层定时执行的sql, HOUR( timediff( now(), createTime) )>1,timediff返回两个datetime值之间的差值,如果sql是当创建订单的时间与现在的时间相隔大于1小时的时候进行删除(修改状态)
//定时删除订单
public static void delBatch() {
update("update wxcms_order set status=-1 where status=0 and HOUR( timediff( now(), createTime) )>1 ",null,Order.class);
}
3.启动定时器时调用
package net.wxcms.koubeichi.listener;
import java.util.List;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpServlet;
import net.wxcms.koubeichi.bean.Wechat;
import net.wxcms.koubeichi.dao.WechatDao;
@WebListener
public class ContextListener extends HttpServlet implements ServletContextListener{
private static final long serialVersionUID = 1L;
public ContextListener() {
}
private java.util.Timer timer = null;
@Override
public void contextInitialized(ServletContextEvent event) {
timer = new java.util.Timer(true);
event.getServletContext().log("定时器已启动");
List<Wechat> list = WechatDao.list();
for(Wechat w:list) {
if(w.getAutoSend()==1) {
timer.schedule(new OrderSendTask(event.getServletContext(),w), 0, 5*60*1000);//第三个参数表示每小时(即60*60*1000毫秒)被触发一次,中间参数0表示无延迟
}
if(w.getAutoEnd()==1) {
timer.schedule(new OrderEndTask(event.getServletContext(),w), 0, 60*60*1000);
}
}
//定时删除订单(每隔1小时执行一次)
timer.schedule(new OrderDelTask(event.getServletContext()), 0, 60*60*1000);
}
@Override
public void contextDestroyed(ServletContextEvent event) {
timer.cancel();
event.getServletContext().log("定时器销毁");
}
}