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

时间:2019-05-12 12:32:15

标签: spring spring-boot activemq quartz-scheduler spring-scheduled

我执行了一些代码,这些代码将在不同的日期时间安排许多作业。因此,总的来说,我将在特定的日期时间执行很多工作。我知道有Spring Scheduler会在某个时间段执行作业,但是它不会动态地调度作业。我可以将ActiveMQ与定时交付一起使用,也可以将Quartz用于我的目的,但需要一些建议。我应该使用Quartz或ActiveMQ定时/延迟交付还是其他方式。

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

2 个答案:

答案 0 :(得分:0)

您可以通过使用cron-expression开始,以解决应用程序将重新启动的情况。 cron表达式可以存储在属性文件中。同样,在计划好应用程序后,您可以通过创建具有另一个cron表达式的新作业实例,以编程方式重新启动或重新安排作业。

答案 1 :(得分:0)

虽然您可以在ActiveMQ中计划消息传递,但它并不是设计用作工作计划程序的,而这正是Quartz所设计的。

在您的评论之一中,您谈到了想要“可扩展的解决方案”,ActiveMQ在大量计划的作业中无法很好地扩展,因为在队列中累积的消息越多,执行起来就越糟糕,因为最终它将将这些消息分页到磁盘,而不是将其保留在内存中。像大多数消息代理一样,ActiveMQ旨在在消耗消息之前将消息保留相对较短的时间。它与数据库更不同,后者更适合此用例。因此,对于大量的工作,Quartz的伸缩性应该比ActiveMQ好。

此外,您可以在Quartz中配置的作业的复杂性更高。如果您使用ActiveMQ,并且最终需要的功能比其支持的功能更多,那么这种复杂性将被降低到您的应用程序代码中。但是,由于Quartz是作为作业调度程序设计的,因此有很大的机会可以简单地使用Quartz完成您想要的事情。

最后,在我看来,数据库比消息代理更易于维护,并且在大多数云提供商中也易于配置数据库。我建议您选择Quartz。