spring - 如何为每个作业打开/关闭 quartz ?

标签 spring schedule

我们正在使用 Spring 4.2.1 和quartz 2.2.1。现在有 2 个工作岗位,但将来我们会有更多工作岗位。我们希望能够为每项作业打开/关闭。有几种方法可以实现这一点。一种是在Java代码中而不是在Spring配置文件中创建作业、作业组、触发器并指定cronExpression。这种方法有效,但似乎它不会起诉 Spring Quartz 集成,而且我们基本上自己管理 quartz 。 请在 ScheduledJobUtility 类后面向下滚动以了解第二种方法。

public class ScheduledJobUtility {

    public static Scheduler defineAndScheduleJob(String jobName, String jobGroup, String triggerName, String cronExpression, boolean isJobEnabled,Class clazz) throws SchedulerException {
        Scheduler scheduler = null;
        JobDetail job = newJob(clazz).withIdentity(jobName, jobGroup).build();
        Trigger trigger = TriggerBuilder.newTrigger().withIdentity(triggerName, jobGroup).withSchedule(CronScheduleBuilder.cronSchedule(cronExpression)).build();
        // Schedule the job with the trigger
        scheduler = StdSchedulerFactory.getDefaultScheduler();
        if(!scheduler.isStarted()) {
            scheduler.start();
        }
        if(isJobEnabled) {
            scheduler.scheduleJob(job, trigger);
        }
        return scheduler;
    }
}

第二种方法是找到一种方法来使用现有的方法 Spring 4.x“org.springframework.scheduling.quartz”包。 我一直在尝试在 afterPropertiesSet() 方法中添加自己的逻辑

private boolean enableJob1 = true;

private boolean enableJob2 = false;

// @Override
public void afterPropertiesSet() throws Exception {
    super.afterPropertiesSet();
    Scheduler scheduler = super.getScheduler();
    if (enableJob1) {    
       JobDetail jobDetail1 = scheduler.getJobDetail(JobKey.jobKey("Job1",                "JobGroup1");
       Trigger trigger1 = scheduler.getTrigger(TriggerKey.triggerKey("myTrigger1","jobGroup1"));
       super.getScheduler().scheduleJob(jobDetail1, trigger1);                
}


if (enableRetryRenditions) {
    if (enableJob2) {    
       JobDetail jobDetail2 = scheduler.getJobDetail(JobKey.jobKey("Job2",                "JobGroup2");
       Trigger trigger2 = scheduler.getTrigger(TriggerKey.triggerKey("myTrigger2","jobGroup2"));
       super.getScheduler().scheduleJob(jobDetail2, trigger2);                
}
}
}

我发现了这个,http://quartz-scheduler.org/documentation/quartz-2.1.x/cookbook/UnscheduleJob

// Unschedule a particular trigger from the job (a job may have more than one trigger)
scheduler.unscheduleJob(triggerKey("trigger1", "group1"));

MySchedulerFactoryBean 扩展 SchedulerFactoryBean"org.springframework.scheduling.quartz.SchedulerFactoryBean 并在配置文件中使用

   <bean class="com.spring.utility.MySchedulerFactoryBean">
        <property name="jobDetails">
            <list>
                <ref bean="jobDetail1"/>
                <ref bean="jobDetail2"/>
            </list>
        </property>

        <property name="triggers">
            <list>
                <ref bean="cronTrigger1"/>
                <ref bean="cronTrigger2"/>
            </list>`enter code here`
        </property>

        <property name="autoStartup" value="true" />
    </bean>

我做了相当多的搜索,但找不到太多关于打开/关闭每项工作的讨论。我一直在研究“org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean”和 “org.springframework.scheduling.quartz.CronTriggerFactoryBean”看看我是否可以扩展该类并添加我自己的逻辑来打开和关闭单个作业。 “org.springframework.scheduling.quartz.SchedulerFactoryBean”有一个属性“”autoStartup”,但我不想为每个作业创建 SchedulerFactoryBean 实例。这对于 50 个作业来说会很困惑。

最佳答案

要“关闭”您的作业,您只需调用 pauseJob 即可暂停这些作业。方法。此调用会暂停与特定作业关联的所有触发器。要恢复作业(实际上是其触发器),您只需调用 resumeJob方法。

甚至还有可用于暂停/恢复作业和触发器组的方法。

因此无需使用schedulerJob和unscheduleJobs方法注册/取消注册作业。这样,您的作业和触发器列表将保持不变。

由于 Quartz 和 Spring API 不允许您在创建触发器时设置“暂停”标志,因此您必须使用 autoStartup=false 的调度程序,然后在某些监听器中,在调用 Scheduler.start() 之前,您将必须遍历作业列表并对其调用暂停作业/恢复作业方法之一。

我不知道您的确切用例,如果您只需要以编程方式暂停/恢复作业,但如果您更喜欢从 GUI 执行此操作,那么我建议您检查 QuartzDesk (我们的产品)。即使是免费(精简版)版本也允许您对作业、触发器、作业组和触发器组执行这两个基本操作。

关于spring - 如何为每个作业打开/关闭 quartz ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32659062/

相关文章:

java - 任何持久更改的审计日志,不使用数据库触发器,而是使用 spring/hibernate

Spring boot 1.5.9,访问 Docker 容器中的资源镜像时出现 404 错误

emacs - 如何在 Emacs 组织模式中插入带有日期和时间的日程表

Python 在特定时间安排作业

Java:Spring AOP 和重构

java - 使用 Citrus 框架和 Spring Integration 从 tcp 服务器接收消息超时

java - 使用scheduleWithFixedDelay安排的java运行任务会在Stop-The-World GC期间停止吗?

linux - CRON 作业未在指定时间运行

c - 如何从 C 在 Linux 中使用 sched_getaffinity 和 sched_setaffinity?

Java 相当于 WCF 数据服务