如何在石英调度程序中限制特定类并发执行的作业实例数?

时间:2013-11-14 13:20:32

标签: quartz-scheduler quartz.net

我有一个班级" Applier"实施Job。 意味着课程" Applier"是Quartz Job的一个例子。

我的要求是控制" Applier"的实例数量。一次执行。 意味着我希望限制,例如,最多5个实例" Applier"执行。 如果第6个实例" Applier"来了,5个实例已经执行,而且必须要等到其中一个实例" Applier"完成。

Quartz Scheduler中是否有等待/通知类型机制。表示如果第6个Job实例运行并且5个实例已经执行比第6个实例必须等待并在5个实例执行中的任何一个完成后通知。

意味着我希望为特定的Job实例提供一些ThreadPool类型机制。 我不想在Quartz Scheduler级别b上使用ThreadPool Like mechanisum,因为它已经由Quartz Scheduler提供了。

2 个答案:

答案 0 :(得分:1)

我不确定你是否意识到这一点,但是所有工作都是jobkey独有的。

  

让我们从这个答案的约定开始

     

JOB - 这意味着一个石英作业

     

Job - Quartz job class

正如我之前提到的那样,只有一个JOB实例。如何发生这种情况,每个JOB都由一个jobkey定义,现在jobkey始终是唯一的

这通常意味着您在JOB和Job之间有一对一的映射,即预定作业(QuartZ作业和实现接口Job的类

是JOB - >工作

  

案例1

多个Job实例而不是多个JOB实例

看起来像

  

工作A - >工作|

     

工作B - >作业| ...........多个JOB运行相同的类

     

JOB C - >工作|

只需在同一个作业组中保留不同的jobkey,就可以将多个Job实例加载到调度程序

请查看JobFactory,因为

  

JobFactory负责生成Job类的实例。

...

  

案例2

现在来到JOB的实例。根据您的日程安排和JOB的执行时间,可以有多个并行运行的实例(将其称为多实例是不合适的,更好的术语是并发执行)。为了避免这种情况,你必须编写一些自定义逻辑。 或者使用注释DisallowConcurrentExecution

加载5作业的实例,如CASE 1中所示,其中包含DisallowConcurrentExecution。但这意味着5个不必要的实例,即使在某个时候可能不需要这个工作。

  

案例3

现在让我们考虑设置一个初始化为1的标志。一个可以帮助处理这个

的自定义逻辑

在你开始工作之前。您可以检查该标志是否小于5.如果小于5,则进入主业务逻辑并增加flag的值。在执行结束之后,在块出来之前递减它。这样,即使您有多个JOB实例正在运行,也不会执行业务逻辑。

    private static int jobRunningFlag = 0;

    @Override
public void execute(JobExecutionContext context) throws JobExecutionException {
    if(JobName.jobRunningFlag <= 5)
        {
            JobName.jobRunningFlag++
    .....execute this piece of code....
            JobName.jobRunningFlag--
    }
}

显然,jobRunningFlag将是存储在同一Job类

中的静态变量
  

PS:   更多答案将基于您的意见。你看过JobFactory和相关的类/接口了吗?你试过什么我的想法是,这将完全归结为您的实现逻辑。我不太喜欢石英,对它们不太了解。

答案 1 :(得分:1)

您可以限制并发运行的作业数(threadpool),也可以将给定的作业实例限制为仅一个并发实例。您不能将给定作业限制为仅给定数量的实例(除1之外)。执行您想要执行的操作的唯一方法是仅为给定的调度程序运行一种作业,然后将线程池限制为您希望以相同的结果运行的作业数