2013-11-14 24 views
2

我有一个实现Job的类“Applier”。 均值类“Applier”是Quartz Job的一个实例。如何限制石英调度程序中特定类并发执行的作业实例数量?

我的要求是控制一次执行“Applier”实例的数量。 意思是我想限制一次,最多5次执行“Applier”实例。 如果第6个“Applier”实例到来并且有5个实例已经执行,那么它必须等待直到“Applier”的一个实例完成。

Quartz Scheduler中是否有任何等待/通知类型机制?意味着如果第6个Job的实例试图运行,并且第5个实例已经执行的第5个实例在5个实例执行完成后必须等待并通知。

意思是我想为Job的特定实例实现一些ThreadPool类型的机制。 我不想要ThreadPool在Quartz Scheduler级别b'coz像mechanisum它已经由Quartz Scheduler提供。

+0

我的情况是许多石英工作JOB单一工作(Quartz类)塞纳里奥。 工作(石英工作) - >工作(石英班) 多对一 我已经把我所有的“Applier”班放在同一组里。 我也把触发器放在同一组中。 我尝试使用JobListner进行控制,但Quartz的“调度程序”类的“pauseJob”不适用于仅执行一次执行的计划的JOB。 我无法找到任何可以“暂停”特定组执行的机制。 我也检查“JobFactory”,但它在我的情况下也没有用。 – Hitesh

回答

1

我不确定您是否知道这一点,但是,所有工作都是jobkey唯一的。

让我们开始对这个答案的公约

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

工作 - 石英作业类

正如我前面提到可以有只有一个作业的一个实例。发生这种情况的是,每个作业由一个作业键定义,现在作业键始终是唯一的

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

这是JOB - >作业

CASE 1

作业的

多个实例和工作不是多个实例

将看起来像

JOB A - > Job |

作业B - >招聘| ...........多个作业运行同一类

作业C - >招聘|

只要保持在同一jobgroup不同jobkey让你工作的多个实例加载到您的调度

看一看JobFactory因为

一个的JobFactory负责生产工作的情况下,类。

..

CASE 2

现在来作业的实例。根据您的日程安排和JOB的执行时间,可能会有多个并发运行的实例(将其称为多个实例更好的术语将是并发执行是不恰当的)。为了避免你将不得不编写一些自定义逻辑。 或使用注释DisallowConcurrentExecution

加载具有DisallowConcurrentExecution的CASE 1中所示的Job的5个实例。但这将意味着5个不必要的事例,尽管在某个时候可能不需要这项工作。

CASE 3

现在让我们来考虑设置初始化为1.自定义逻辑可以帮助处理这个

开始之前,你工作的标志。您可以检查该标志是否小于5.如果小于5则进入主业务逻辑并增加标志值。在块出来之前执行结束后递减它。这样,即使您有多个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将存储在同一个作业类的静态变量

PS: 更多的答案,这将根据您的意见。你看过JobFactory和相关的类/接口吗?你有什么尝试。我的想法是这将完全落实到你的实现逻辑上。我对石英不太了解,对他们没有太多的想法。

+1

我的案例是许多石英作业工作单(Quartz类)塞纳里奥。 工作(石英工作) - >工作(石英班) 多对一 我已经把我所有的“Applier”班放在同一组里。 我也把触发器放在同一组中。 我尝试使用JobListner进行控制,但Quartz的“调度程序”类的“pauseJob”不适用于仅执行一次执行的计划的JOB。 我无法找到任何可以“暂停”特定组执行的机制。 我也检查“JobFactory”,但它在我的情况下也没有用。 JobFactory实现类不提供任何特殊的机制来“暂停”方法。 – Hitesh

+0

我也试图想出一个办法。你可以看看EJB调度器。或者归结为像CASE 3这样的戏剧,这意味着定制逻辑。我将更新一些东西给我的答案尝试查看它们 – Acewin

+0

在进入执行方法调用时,首先检查作业是否针对存储在其中的标志变量和值。并且将该作业的实际执行移入条件逻辑内 – Acewin

1

您可以限制同时运行的作业数(线程池),也可以将给定的作业实例限制为只有一个并发实例。您不能将给定的作业限制为仅给定数量的实例(1以外)。做你想做的唯一方法是只为一个给定的调度器运行一种工作,然后限制线程池到你想在同一个tieme上运行的工作数量