关于定时器的使用疑问?在线等

wangxiaomax 2007-03-13 03:32:52
我定义了一个定时器,每隔一分钟处理数据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();
}
}

}
...全文
300 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
qzjackie 2007-03-21
  • 打赏
  • 举报
回复
mark
emin_lee 2007-03-14
  • 打赏
  • 举报
回复
mark!
yeah920 2007-03-14
  • 打赏
  • 举报
回复
定义一个全局的flag指示上一次的task是否完成。

可以这样做的。
下一次开始前,先检查这个flag。
pdvv 2007-03-14
  • 打赏
  • 举报
回复
为什么用定时器?这样你用什么标志都不能根本解决问题。建议使用多线程,在线程内sleep你需要的时间,可以保证顺序执行。

类似的发短信程序我也写过,一秒发送一次都没有问题,单次发送量几万。
Oscarming 2007-03-14
  • 打赏
  • 举报
回复
up
  • 打赏
  • 举报
回复
如果数据不能删除的话,可以定义一个表示当前处理位置指针的变量,处理完一条数据改变一下指针。下次循环从当一次指针所指示位置开始处理数据。

如果楼主不想采用多线程的方式,为防止这次循环没结束又开始下一次循环而造成处理混乱,应规定本次循环的执行时间为一固定时间。每处理完一条数据算一下当前用时,如果超过规定时间,则结束本次循环。这个时间应小于定时器的时间,留有一点余量。比如定时器是30秒,则这个时间应定为20秒至25秒。


另外一个办法是给每条记录加一个是否已处理的状态标记。这样处理一条改变一下状态。这种方式,即使是对于多线程的方式也有效。

再有就是建立一个待发送数据池,每处理一条就从池中把该数据删除。这个对多线程方式也有效。
wfu 2007-03-13
  • 打赏
  • 举报
回复
定义一个全局的flag指示上一次的task是否完成。
Mybeautiful 2007-03-13
  • 打赏
  • 举报
回复
up 一下...

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧