石英作业比。线程立即执行一次任务

时间:2014-08-29 16:00:29

标签: java multithreading quartz-scheduler runnable

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

  1. 使用简单的触发器设置Quartz作业,只能触发一次并尽快触发。
  2. 创建一个Runnable实例,将其移交给一个Thread,然后调用run();
  3. 在上述情况下,我有以下问题:

    1. 使用Quartz作业让我觉得线程没有?
    2. 使用可运行的东西让我使用石英作业的不是什么?
    3. 就最佳实践而言,应该使用什么标准来决定此用例的Quartz作业和runnables?

4 个答案:

答案 0 :(得分:4)

使用Quartz,您可以使用许多功能,并且已经很好地实现了#34;,例如:

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

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

开始新主题:

  • 重量轻没有工作持久性,石英api等。
  • 您的应用程序在没有额外依赖性的情况下运行(石英)
  • 错误源(来自石英)减少

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

如果你的担心只是异步,你就可以开始一个线程。如果还有其他问题,比如聚类,您可以考虑使用quartz。

答案 1 :(得分:2)

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

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

Quartz将线程包装到一个高级概念(Job)以及它带来的所有内容。

从代码库的角度来看,您可以获得具有相同语义的所有作业的一致性,您的开发人员不必“仅为一个线程”“转换”。之后,他们可能“只是做一个线程”,并进入Quartz无痛地管理的复杂性。

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

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

答案 2 :(得分:0)

如果它是一次性工作并且没有其他要求,例如工作持续性,日程安排等,那么您最好使用常规线程。

  1. Quartz作业比常规线程更健壮,支持日程安排,工作持久性等,以及您可能不需要的所有其他内容。
  2. 无需使用RunnablesThreads
  3. 进行任何设置
  4. 如果您认为可能有更多的工作,这个,预定的工作,延迟的工作等,您有两个选择:使用Java的标准Excecutors。设置线程池并使用它来运行您的作业。您可能还想使用Spring的TaskExecutor抽象,这样您就可以在需要时轻松切换Quartz和Executors。但这对于一次性演出来说似乎有些过分。

答案 3 :(得分:0)

对于即时1次任务,线程就足够了。 但是有更好的插件,如quartz,Spring Scheduler