Java中定时器功能有哪些好的实现方案?

想实现一个功能,需要定期查看一个表,并发送消息。
在Java中,有哪些好的实现方案?资源耗费情况如何?容错能力好的有哪些?

请高手支招。

谢谢。

阅读 14.8k
6 个回答

用 Quartz 进行作业调度

Quartz 是个开放源码项目,提供了丰富的作业调度集。在这篇文章中,软件工程师 Michael Lipton 和 IT 架构师
Soobaek Jang 对 Quartz API 进行了介绍,从对框架的一般概述开始,并以一系列展示 Quart
基本特性的代码示例作为结束。在阅读完本文并看过代码示例后,您应当能够把 Quartz 的基本特性应用到任何 Java™ 应用程序中。

对于java本身提供的功能来说, 就是Timer 和 ScheduledThreadPoolExecutor了.

我找了这个网页:
http://dumb-coder.blogspot.sg/2012/10/timer-vs-scheduledthreadpoolexecutor.html

和我一直的理解是一致的. 每一个Timer对应一个后台线程, 其接收到的TimerTasker 被放入队列中(具体实现应该是一个小顶堆). 适合少量的, 短的任务.

如果要处理多个, 长时间的任务, 并且对时间 和 并行处理有要求的, 用ScheduledThreadPoolExecutor.


如果在Java EE环境下, 还可以考虑EJB timer
http://docs.oracle.com/javaee/6/tutorial/doc/bnboy.html

以前用过, 印象最深的就是 1). 可以和transaction一起用, 如果事务回滚, timer的创建/取消也会回滚. 2). persistent. 应用服务器重启后, timer不会丢失.

推荐使用Spring的task,通过标注方式实现,方便简单

<task:executor id="executor" pool-size="5" />
<task:scheduler id="scheduler" pool-size="10" />
<task:annotation-driven executor="executor" scheduler="scheduler" />

spring task , 如果你在用spring的话

如果是简单的定时调度,使用Timer就够了,如果复杂的调度任务,可以考虑使用Quartz,容错能力要看你写的代码了,不管使用哪种方式,Timer和Quartz都是稳定的。

  1. java自带的java.util.Timer
  2. Spring3.0以后的task
  3. 开源项目Quartz
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题