当前位置: 首页 > 知识库问答 >
问题:

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

祁均
2023-03-14

我有一个实现作业的类“Applier”。意思是类“Applier”是石英作业的实例之一。

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

Quartz调度器中是否有等待/通知类型机制。意味着如果作业的第6个实例尝试运行,而5个实例已经执行,则第6个实例必须在5个实例中的任何一个执行完成后等待并通知。

这意味着我想为特定的作业实例实现一些线程池类型的机制。我不希望像mechanisum这样的线程池出现在Quartz调度器级别的b'Z,因为它已经由Quartz调度器提供了。

共有2个答案

慕容晔
2023-03-14

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

郎项禹
2023-03-14

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

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

工作——这意味着一份石英的工作

工作——石英工作班

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

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

哪一项是工作-

案例1

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

看起来像

工作A-

工作B-

工作C-

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

看看JobFactory,因为

JobFactory负责生成作业类的实例。

..

案例2

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

加载5个作业实例,如案例1所示,其中不允许OnCurrentExecution。但这将意味着5个不必要的例子,即使有时可能不需要这份工作。

案例3

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

在你开始工作之前。您可以检查标志是否小于5。如果小于5,则进入主业务逻辑并增加标志的值。执行结束后,在退出程序段之前,将其减量。这样,即使有多个作业实例在运行,也不会执行业务逻辑。

    private static int jobRunningFlag = 0;

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

显然jobRunningFlag将是一个静态变量,存储在同一个Jobs类中

PS:更多的答案将基于你的评论。你看过JobFactory和相关的类/接口了吗。你试过什么。我的想法是,这将完全取决于您的实现逻辑。我对石英不太在行,对它们也不太了解。

 类似资料:
  • 问题内容: 我正在使用“石英计划”,并且有2个工作。第一项作业将执行大约2分钟的任务,第二项作业将被设置为清理临时文件。因此,我需要设置计划表,使其工作方式如下:在执行完第一项任务/完成任务后,我需要在第二项任务的帮助下进行清洁操作。 考虑示例9-Quartz 2.1.x下的作业侦听器,它声明我们可以定义一个名为jobWasExecuted(,)的方法;在Job Listener中,它在第一个作业

  • 问题内容: 这应该真的很容易。我使用的是在Apache Tomcat 6.0.18下运行的Quartz,我有一个jobs.xml文件,该文件设置了每分钟运行的计划作业。 我想做的是,如果下一个触发时间到来时该作业仍在运行,则我不想启动新作业,因此可以让旧实例完成。 有没有办法在Jobs.xml中指定此设置(防止并发实例)? 如果不是,是否可以共享我的应用程序Job实现中对内存中单例的访问(这是通过

  • 是否可以添加/删除/修改在Quartz Spring Boot中动态安排的作业(在运行时),由使用我的门户的最终用户。由于计划无法从外部访问,我不知道有什么办法。基本上,我需要将所有的时间表信息存储到数据库中并访问它们。Im构建的门户将被大量用户使用,实现这一目标的正确解决方案是什么? 否则我可以像下面这样使用cron吗 每5 mns扫描一次作业以实现此目的。

  • 使用spring 2.5和quartz 1.6.2,我一直试图每分钟触发一个计划任务 我的xml文件是: 我的代码是:

  • 我有一个2节点的HA服务器。节点1处于活动状态,节点2处于备用状态。 我已经做了一个应用程序,并使用quartz api做集群。我已经把数据库里的所有桌子都做好了。 现在,我是否需要同时在节点或jst节点1中运行该模块,以便当节点1关闭时,应用程序自动在节点2中启动。 在两个节点中运行模块时,触发器和作业名应该相同还是不同? ThreadPool.ThreadCount=10 ThreadPool

  • 问题内容: 我正在寻找python的企业任务计划程序,就像石英是Java一样。要求: 持久:如果进程重新启动或计算机重新启动,则所有作业必须保留在该位置,并且必须在重新启动后解雇。 作业必须在事务中进入和退出调度程序(即,如果某个数据库操作失败,在与调度程序无关的数据库中,则作业必须没有退出或进入调度程序)。 可扩展性。取决于项目成功的程度,但是我更希望从一开始就知道我不是从无到有来。 可配置性: