使用Thread.sleep(),Timer或platform cron作业在Java EE应用程序中进行定期操作

时间:2011-12-17 12:29:07

标签: java java-ee scheduled-tasks

我有一个Java EE应用程序,每十五分钟从互联网上下载股票价格。从计时准确性的角度来看,最好是应用程序内化此周期性操作,即将Thread.sleep()与计数器结合使用或设置计时器或者通过URL公开任务并拥有平台cron会更好作业定期点击URL(当然是按要求的频率)。

这两种方法的优点和缺点是什么?

我看到针对OpenJDK实现报告的计时器错误让我感到震惊。该错误表明,系统时间的变化会影响与时间相关的操作和方法(如睡眠和计时器周期)的操作。

3 个答案:

答案 0 :(得分:2)

Timer未被弃用,但现在有更好的替代方案:SheduledExecutorService。使其更好的一个原因是它使用相对时间而不是绝对时间进行调度。

使用外部cron脚本或内部计时器只是一个问题或偏好,恕我直言。内部计时器更容易设置,但如果您已经安装了其他计算机,则可能需要使用另一个计时器,并将此职责放在一个位置。

答案 1 :(得分:1)

Thread.sleep不是定期执行代码的推荐方法。这是不准确的,通常是糟糕设计的标志。我建议你使用Timer类来定期安排代码的执行。

答案 2 :(得分:1)

绝对考虑使用为该任务构建的调度作业。尝试从任何时序考虑中分离任务本身。

  • 正如所建议的那样,Quartz是一个不错的选择。
  • Cron也不错,但需要更多设置才能与您的系统集成 任务。
  • 如果在Java EE上,您可以使用EJB计时器。
  • 您可以使用ScheduledExecutorService(不推荐)推荐自己的