2013-12-09 24 views
0

虽然我以前在Quartz方面有过一些经验,但我在现有项目上首次从零开始设置它。我们决定使用Quartz(部分)为未来的需求做准备。针对多个用户启动的任务的石英建议

我要寻找的建议/建议在以下方面:

要求

  • 将有几种不同类型的用户发起的任务,每一个从几秒钟抽出几分钟任何地方。这些需要与请求它们的用户异步执行,并且即使用户在临时注销时也要启动。
  • 这些任务将被分组到各个类别中。
  • 在每个类别中,只有N(配置)任务应该同时执行
  • 每个用户都必须能够检索任务列表他们,他/她发起
  • 管理员必须能够检索任务列表为所有用户
  • 任务必须在执行
  • 任务的中间撤销必须撤销,而排队
  • 如果出现故障,那是正在执行需要恢复并重新启动
  • 聚类任何任务必须被supprorted

选项

我看到执行下列选项,并会很感激一些反馈。

  1. 多为自托管
    • 维护自己独立的任务表,与预定的时间,用户,状态栏等
    • 每组有运行每x秒,检查一个石英工作为表中的下一个任务执行并行执行。
    • 我不知道如何在这种情况下实现n个并行执行,除了每个组的n个Quartz作业。
    • 我期望在这种情况下Quartz不需要在重启时保留任何东西,尽管这意味着我的代码必须处理这种情况。
    • 如果没有任务安排,石英工作仍然会火
  2. 石英管
    • 每个任务的单独石英工作。
    • 我不确定在这种情况下如何允许每组n个并行作业。看来Quartz注释可以用来一次阻止多个并行的Job。
    • 石英表需要在数据库中保存。
    • 石英本身将负责重新启动后恢复。
    • 如果没有计划任务,则不会触发Quartz作业。
  3. 还有其他的东西吗?

我不确定(提前)上述每个要求对应的要求如何。

我希望根据我上面写的内容提供反馈意见。我找不到很多关于这方面的指导,因为大多数似乎仅限于以特定间隔或时间运行的Quartz作业,并执行与用户调度或用户请求无关的特定任务。

谢谢。

回答

0

你确定你在谈论

多为自托管 - 这听起来更像是你要写出自己的调度

石英管 - 一旦加入到调度所有的作业都石英管理仅

要你只需写了一些东西,你可以CA的任何变化可以停止特定作业等。

只有当执行的时间间隔比预定时间间隔多时,任何作业才会并行运行。

一次只运行一个作业只是表示您正在使用@DisallowConcurrentExecution来禁用任何特定作业的并发执行。要具体计算每个组的作业实例数量,您需要编写一些自定义逻辑。

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

您可以检查如何拥有Quartz作业持久性。再次自己动手。我确信Quartz有足够的信息和如何实现它。

请记住所有的API不仅仅是QuartZ提供了一组操作。但是实现以及如何使用它们来到开发人员身上。总是提供固定的大纲和如何指导可用。 Java是一种拥有大量文档的语言。


您可以通过这个讨论 Controlling instances of Job


BTW这将是自己的自定义实现获取帮助。我还没有尝试过检查任何可用的石英插件。


只是想到了另一种解决方案。如果你有任何UI界面或添加任务。和任何间隔(再次..........)

你可能做的是,将你的作业写入堆栈 Quartz作业可以简单地读取堆栈并将其作为单独的线程加载。

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

这样你就可以控制

线程

的数量,我认为这是未来的多为实施计划

+0

Acewin嗨。感谢您的答复。我想过你的问题,并且一直在做更多的阅读。我现在可以更好地(希望)以这种方式重述我的问题:用户启动任务。我想使用Quartz来调度和限制正在运行的同时任务的数量。我最好是(a)每个任务有一个Quartz作业实例,并根据需要使用专门的Quartz作业来触发它们,或者(b)有一个Quartz作业并根据数量创建n个触发器未完成的工作。这是否澄清我的问题? – Ask613

+0

是的,现在清楚如何进行你应该能够拿出一个解决方案。当使用API​​唯一的方式来解决这个问题时,这是实施解决方案 – Acewin