2

我有一个实现 Job 的“Applier”类。表示“Applier”类是 Quartz Job 的实例之一。

我的要求是控制一次执行的“Applier”实例的数量。意味着我想限制,比如一次最多执行 5 个“Applier”实例。如果“Applier”的第 6 个实例出现并且 5 个实例已经在执行,则它必须等到“Applier”实例之一完成。

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

意味着我想为 Job 的特定实例实现一些 ThreadPool 类型的机制。我不希望 Quartz Scheduler 级别的 ThreadPool Like mechanisum b'coz 它已经由 Quartz Scheduler 提供。

4

2 回答 2

1

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

于 2014-05-27T15:37:52.737 回答
1

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

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

工作——这意味着一个石英工作

作业——Quartz 作业类

正如我之前提到的,JOB 只能有一个实例。这是怎么发生的,每个 JOB 都由一个 jobkey 定义,现在 jobkey 总是唯一的

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

这是工作 -> 工作

情况1

多个作业实例而不是多个作业实例

看起来像

工作 A -> 工作 |

JOB B -> Job |...........多个 JOB 运行同一个类

工作 C -> 工作 |

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

看看JobFactory因为

JobFactory 负责生成 Job 类的实例。

..

案例二

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

加载 5 个具有 DisallowConcurrentExecution 的作业实例,如案例 1 所示。但这将意味着 5 个不必要的实例,即使一次可能不需要该作业。

案例 3

现在让我们考虑设置一个初始化为 1 的标志。可以帮助处理此问题的自定义逻辑

在你开始你的工作之前。您可以检查 flag 是否小于 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 和相关的类/接口。你试过什么。我的想法是这将完全归结为您的实现逻辑。我对石英不太好,对它们不太了解。

于 2013-11-14T21:06:05.897 回答