我定义了一个定时器,每隔一分钟处理数据600条(发送短信,并修改短信状态),正常情况下只需30秒就可以了。但由于异常情况下,处理不完那么多数据,下次循环又处理此纪录,应该怎么办呢?
我的想法是1分钟还是去扫描600条,如果没有处理完,下次扫描则顺延,上次数据没处理完,定时器不能执行。请问能实现吗?多谢啦!!!
web.xml
<listener>
    <listener-class>SMSListener</listener-class>
</listener>SMSListener.java
public class SMSListener extends HttpServlet implements ServletContextListener {
  private static Timer timer;  public SMSListener() {
  }  public void contextInitialized(ServletContextEvent event) {
    timer = new Timer(true);
    //1分钟执行600条新短信插入
    timer.schedule(new SMSTask(event.getServletContext()), 0,  60*1000);
  }  public void contextDestroyed(ServletContextEvent event) {
    timer.cancel();
  }}SMSTask.java
public class SMSTask extends TimerTask {
  private ServletContext context = null;  public SMSTask() {
  }  public SMSTask(ServletContext context) {
    this.context = context;
  }  public void run(){
    try {
      //业务逻辑
    }
    catch (Exception e) {
      e.printStackTrace();
    }
  }}

解决方案 »

  1.   

    定义一个全局的flag指示上一次的task是否完成。
      

  2.   

    为什么用定时器?这样你用什么标志都不能根本解决问题。建议使用多线程,在线程内sleep你需要的时间,可以保证顺序执行。类似的发短信程序我也写过,一秒发送一次都没有问题,单次发送量几万。
      

  3.   

    定义一个全局的flag指示上一次的task是否完成。可以这样做的。
    下一次开始前,先检查这个flag。