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



我有一个Java EE应用程序,它每十五分钟从网上下载一次股票价格。从计时精度的角度来看,应用程序最好内化这种周期性操作,即使用Thread.sleep()与计数器或设置计时器相结合,或者通过URL公开任务并让平台cron作业定期访问URL(当然是在所要求的频率下)。

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

我被一个针对OpenJDK实现的计时器bug吓坏了。该漏洞指出,系统时间的变化影响了与时间相关的操作和方法的运行,如睡眠和定时器周期。

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

使用外部cron脚本或内部计时器只是一个问题或偏好,IMHO。内部计时器更容易设置,但如果您已经有了其他的crons,您可能希望使用一个额外的计时器,并在一个地方完成此任务。

一定要考虑使用为任务构建的调度作业。尝试将任务本身从任何时间考虑中分离出来。

  • 按照建议,Quartz是一个不错的选择。
  • Cron是不错的,但是需要更多的设置来集成你的任务。
  • 如果在Java EE上,你可以使用EJB定时器。
  • 你可以自己使用ScheduledExecutorService(不推荐)

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

最新更新