多用户启动任务的Quartz建议

时间:2013-12-09 19:53:05

标签: grails parallel-processing quartz-scheduler

虽然我以前对Quartz有一些经验,但我是在现有项目中首次从头开始设置它。我们决定使用Quartz(部分)来为未来的需求做准备。

我正在寻找以下建议/建议:

要求

  • 将会有几种不同类型的用户启动任务,每项任务从几秒到几分钟不等。这些需要从请求它们的用户异步执行,并且即使用户在过渡期间注销也要启动。
  • 这些任务将分为几类。
  • 在每个类别中,一次只能执行n个(可配置的)任务
  • 每个用户必须能够检索他/她发起的任务列表
  • 管理员必须能够检索所有用户的任务列表
  • 任务必须在执行
  • 的过程中取消
  • 排队时必须取消任务
  • 如果出现故障,任何正在执行的任务都需要恢复并重新启动
  • 必须取消群集

选项

我看到了以下实施选项,非常感谢您的反馈。

  1. 主要是自我管理
    • 维护我自己的单独任务表,其中包含预定时间,用户,状态等列。
    • 每组运行一个Quartz作业,每隔x秒运行一次,检查表中的下一个任务,然后并行执行。
    • 除了每组n个Quartz作业外,我不确定如何在这种情况下实现n个并行执行。
    • 在这种情况下,我希望Quartz不需要在重启时保留任何内容,但这意味着我的代码必须处理这种情况。
    • 如果没有安排任务,Quartz作业仍会启动
  2. Quartz Managed
    • 每个任务都成为一个单独的Quartz Job。
    • 在这种情况下,我不确定如何允许每组n个并行作业。似乎Quartz注释可以用于一次防止多个并行作业。
    • 需要在数据库中保留Quartz表。
    • 重启后,Quartz本身将负责恢复。
    • 如果没有安排任务,则不会触发任何Quartz作业。
  3. 其他什么?
  4. 我不确定(提前)上述各项对应要求的容易程度。

    根据我上面所写的内容,我将不胜感激。我找不到很多关于此的指导原则,因为大多数似乎仅限于以特定间隔或时间运行的Quartz作业,并执行独立于用户调度或用户请求的特定任务。

    感谢。

1 个答案:

答案 0 :(得分:0)

你确定你在说什么

主要是自我管理 - 这听起来更像是你要编写自己的调度程序

Quartz Managed - 一旦添加到调度程序,所有作业都只进行石英管理

  
    

要进行任何更改,您只需要编写一些可以调用Manager类的东西,这可以停止特定的工作等等。

         

任何作业只有在执行的时间间隔远远超过预定的时间间隔时才会并行运行。

         

一次只运行一个作业只意味着您正在使用@DisallowConcurrentExecution来禁用特定作业的任何并发执行。要专门为每个组运行的作业实例计数,您需要编写一些自定义逻辑。

         

提示:所有Quartz作业都通过JobExecutionContext,找出它是哪个作业组。然后添加..........自己想想。

         

您可以查看如何使用Quartz作业持久性。再次自己动手吧。我相信Quartz有足够的信息来解决这个问题以及如何实现它。

  

请记住所有API不仅仅是QuartZ提供了一系列操作。但是实现以及如何使用它们来自开发人员。总是提供固定的轮廓以及如何引导可用。 Java是一种拥有大量文档的语言。


您可以通过此讨论获得帮助 Controlling instances of Job


BTW它将是您自己的自定义实现。我现在还没有尝试检查任何可用的石英插件。


想到另一个解决方案。如果您有任何UI界面或添加任务的东西。和任何间隔(再次..........)

您可能会做的是,将您的工作写入堆栈 QuartZ作业可能只是读取堆栈并将其作为单独的线程加载。

创建具有固定线程数的线程池。在这个线程池中,我们可以生成线程。

这样你就可以控制线程数

我认为这更像是一个实施计划