在 Java 中的某个特定时间安排任务

Scheduling task at some specific time in Java

我有一些代码执行会在不同的日期时间安排许多作业。所以总的来说,在特定的日期时间我会有很多工作要做 运行。我知道有 Spring Scheduler 会在某个时间段执行作业,但它不会动态安排作业。我可以将 ActiveMQ 与定时交付或 Quartz 用于我的目的,但正在寻找一些建议。我应该使用 Quartz 还是 ActiveMQ timed/delayed 交付或其他方式。

在定时执行的执行器服务中还有另一种选择,但如果应用程序重新启动,我相信作业将会消失。任何帮助将不胜感激。

您可以从使用 cron-expression 开始,以涵盖您的应用程序何时重新启动的情况。 cron-expression 可以存储在属性文件中。此外,当您的应用程序被安排时,您可以通过使用另一个 cron-expression 创建一个新的作业实例,以编程方式重新启动或重新安排您的作业。

虽然您可以在 ActiveMQ 中安排消息传递,但它并非设计用作作业调度程序,而这正是 Quartz 的设计目的。

在您的一条评论中,您谈到想要一个 "scalable solution" 并且 ActiveMQ 无法很好地扩展大量的计划作业,因为队列中累积的消息越多,它的性能就越差,因为它最终必须将这些消息分页到磁盘而不是将它们保存在内存中。与大多数消息代理一样,ActiveMQ 的目的是在消息被使用之前将消息保留相对较短的时间。它与更适合此 use-case 的数据库有很大不同。由于这个原因,对于大量作业,Quartz 应该比 ActiveMQ 更好地扩展。

此外,您可以在 Quartz 中配置的作业的复杂性更高。如果您使用 ActiveMQ 并且您最终需要的功能比它支持的更多,那么这种复杂性将被推入您的应用程序代码中。但是,很有可能可以简单地用 Quartz 做你想做的事,因为它被设计为一个作业调度程序。

最后,在我看来,数据库比消息代理更 straight-forward 需要维护,而且数据库在大多数云提供商中也很容易配置。我建议您使用 Quartz。