【问题标题】:Scheduling task at some specific time in Java在Java中的某个特定时间安排任务
【发布时间】:2019-09-29 15:25:10
【问题描述】:

我有一些代码执行会在不同的日期时间安排许多作业。所以总的来说,我将有很多工作在特定的日期时间运行。我知道有 Spring Scheduler 会在某个时间段执行作业,但它不会动态安排作业。我可以将 ActiveMQ 与定时交付或 Quartz 一起用于我的目的,但需要一些建议。我应该使用 Quartz 或 ActiveMQ 定时/延迟交付或其他东西吗?

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

【问题讨论】:

  • 这是 Dina 之前建议的,但在这里再次建议,因为它在执行程序服务中调度,如果应用程序重新启动,作业可能会被删除。

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


【解决方案1】:

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

在您的一个 cmets 中,您谈到想要一个“可扩展的解决方案”,而 ActiveMQ 不能很好地适应大量计划的作业,因为队列中积累的消息越多,它的性能就会越差,因为它最终会有将这些消息分页到磁盘而不是将它们保存在内存中。与大多数消息代理一样,ActiveMQ 旨在在消息被使用之前将消息保留相对较短的时间。它与更适合此用例的数据库有很大不同。出于这个原因,对于大量作业,Quartz 应该比 ActiveMQ 更好地扩展。

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

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

【讨论】:

  • 我知道 Active-MQ 不是为调度目的而开发的,而石英有其背后的确切动机。我使用 Active-MQ 的唯一原因是代码维护会少得多,因为我们已经知道这个排队系统已经支持数十亿的消息传输,那么为什么不使用延迟消息呢。我肯定会检查 Quartz,但在春季或其他一些可维护性较低的构建中是否有其他替代方案。请提出建议。
【解决方案2】:

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

【讨论】:

  • 是的,可以这样做,但那样的话,我的代码最终会为我维护很多东西。相反,我更倾向于 Active-MQ 解决方案,我将成为生产者,我将成为消费者。在 Active-MQ 中推送消息时,我将设置它应该被使用的时间,并且我不必在我的代码方面维护太多。但我不确定这是否是一个可扩展的解决方案。
  • 这可能是一种可能的解决方案,但您将在系统中再引入一个组件。您应该考虑是否可以维护 ActiveMQ,这里我首先谈论的是基础架构要求。
  • 如果我能获得更多关于 Active-MQ 解决方案的意见,那就太好了。
  • 在 AWS 中部署一个 Active-MQ 组件并不是什么大不了的事,我总是可以为它编写生产者和消费者。但只是在这种情况下,我不必像石英一样在数据库端维护任何东西,也不需要像 spring scheduler 那样做更多的查询。
  • 好吧,如果您将部署在 AWS 中并且您可以支付使用 ActiveMQ 的费用,那么这似乎是一个正确的选择。恕我直言,继续使用此解决方案。
猜你喜欢
  • 1970-01-01
  • 2012-08-01
  • 1970-01-01
  • 2018-09-09
  • 2012-09-18
  • 1970-01-01
  • 2015-01-04
  • 2015-05-09
  • 2016-07-30
相关资源
最近更新 更多