Quartz作业与即时一次性任务的线程相比



假设我有一些工作单元需要完成,我想相对于应用程序的其他部分异步完成,因为这可能需要很长时间,例如10秒到2分钟。为了实现这一点,我正在考虑两种选择:

  1. 用一个简单的触发器安排Quartz作业,只需尽快启动一次
  2. 创建一个Runnable实例,将其交给线程,然后调用run();

在上述情况下,我有以下问题:

  1. 使用Quartz作业能让我得到线程没有的东西吗
  2. 使用runable能给我带来什么,而使用石英作业却不能
  3. 就最佳实践而言,在这个用例中,应该使用什么标准来决定Quartz作业和可运行程序

使用Quartz,您可以"很好地实现"许多功能,如:

  • 作业执行的事务管理
  • 作业持久性,以便我们了解正在运行的作业的状态
  • 群集支持
  • 调度控制,即使您只需要简单的触发器。但它提供了可能性

如果不使用它,你必须自己控制它们,有些问题可能会很复杂。

启动新线程:

  • 轻量级无工作持久性、石英api等
  • 您的应用程序运行时没有额外的依赖性(石英)
  • 减少了(来自石英的)误差源

这取决于您想要启动哪种作业,以及应用程序的其他功能是否也需要作业调度。

如果您关心的只是异步,那么您可以启动一个线程。如果还有其他问题,比如集群,您可以考虑使用石英。

我不会仅仅为了这个功能而将Quartz添加到项目中,但如果我已经安装了Quartz并正在使用它,那么,是的,即使是一次性的,我也会使用一次性即时Quartz作业。

原因只是一致性。Quartz已经管理了线程和作业过程的所有细节。单个线程很简单,但我们也从经验中知道,即使是单个线程也可能不简单。

Quartz将线程包裹在一个高水平的概念(工作)中,以及它所带来的一切。

从代码库的角度来看,您可以获得具有相同语义的所有作业的一致性,您的开发人员不必"仅为一个线程"而"换挡"。稍后,他们可能会"只做一个线程",并运行到Quartz轻松管理的复杂性中。

在这种情况下,制作Quartz作业的抽象开销和条件不足以只使用线程,因为"它的重量更轻"。

一致性和通用性是代码库的重要方面。我会尽我所能坚持单一的抽象和杠杆作用。

如果它是一次性作业,并且没有额外的要求,如作业持久性、调度等,那么使用常规线程会更好。

  1. Quartz作业比常规线程健壮得多,并且支持调度、作业持久性等,所有其他你可能不需要的东西
  2. 无需使用RunnablesThreads设置任何内容
  3. 如果你认为可能会有更多的作业,如计划作业、延迟作业等,你有两个选择:使用Java的标准Excecutors。设置一个线程池并使用它来运行作业。你可能还想使用Spring的TaskExecutor抽象,这样你就可以在需要的时候轻松地在Quartz和Executors之间切换。但对于一次性工作来说,这似乎有些过头了

对于即时的1次任务,线程就足够了。但也有更好的插件可用,如石英,Spring Scheduler

最新更新