我不确定您是否知道这一点,但所有工作都是 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 和相关的类/接口。你试过什么。我的想法是这将完全归结为您的实现逻辑。我对石英不太好,对它们不太了解。