java - 如何使用 Spring/Quartz 动态更改作业的调度?

标签 java spring quartz-scheduler

我正在使用这些方法启动/停止作业:

ClassPathXmlApplicationContext scheduleContext;

public void startJobs() {
    scheduleContext = new ClassPathXmlApplicationContext("applicationContext.xml");
}

public void stopJobs() {
    scheduleContext.close();
}

应用程序上下文.xml:

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"
    xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:task="http://www.springframework.org/schema/task"
    xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-4.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.2.xsd">

    <bean name="quartzJob"
        class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
        <property name="jobClass" value="mypackage.TestSpringJob" />
        <property name="durability" value="true" />
    </bean>

    <bean id="simpleTrigger"
        class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
        <property name="jobDetail" ref="quartzJob" />
        <property name="repeatInterval" value="2000" />
    </bean>

    <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="jobDetails">
            <list>
                <ref bean="quartzJob" />
            </list>
        </property>
        <property name="triggers">
            <list>
                <ref bean="simpleTrigger" />
            </list>
        </property>
    </bean>
</beans>

例如,是否可以更改作业的 repeatInterval 属性或向调度程序动态添加新作业?

如果是这样,我该如何实现?

最佳答案

您可以动态定义作业和触发器并动态安排作业。

    // Create Job
    JobDetailFactoryBean JobDetail = new JobDetailFactoryBean();
    jobDetail.setJobClass(ScheduledJob.class);
    jobDetail.setName("reportJob1");
    jobDetail.setDurability(true);
    jobDetail.setJobDataMap(new JobDataMap());
    jobDetail.afterPropertiesSet();

    // create CRON Trigger
    CronTriggerFactoryBean trigger = new CronTriggerFactoryBean();
    trigger.setBeanName("UniqueCronBeanName");
    trigger.setGroup("uniqueCronGroup");
    trigger.setJobDetail(jobDetail.getObject());
    trigger.setCronExpression("0 0 12 * * ?");
    trigger.afterPropertiesSet();

然后您可以通过将其设置为定义的调度程序工厂来安排您的作业。

    schedulerFactoryBean.getScheduler().scheduleJob(jobDetail.getObject(), trigger.getObject());

要更新Scheduler repeat Interval or cron expression,可以如下实现。

    List<? extends Trigger> triggerList =
      schedulerFactoryBean.getScheduler().getTriggersOfJob(new JobKey(jobName, jobGroup));

    // get the trigger from Builder
    TriggerBuilder tb = triggerList.get(0).getTriggerBuilder();
    Trigger newTrigger =
         tb.withSchedule(SimpleScheduleBuilder.simpleSchedule().withRepeatCount(10)).build();
    Date updatedTriggerDate =
     schedulerFactoryBean.getScheduler().rescheduleJob(triggerList.get(0).getKey(), newTrigger);

关于java - 如何使用 Spring/Quartz 动态更改作业的调度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36280721/

相关文章:

java - 使用 Hibernate JPA 2.1 将应用程序部署到 IBM WebSphere 会出现 NullPointerException

java - Spring 4.1.5.RELEASE 中的 ResourceUrlEncodingFilter 启用了 springSecurityFilterChain

java - Spring Cache - 使用自定义键更改其他缓存方法后,如何获取所有实际数据实体的列表?

java - Quartz调度器-时间间隔

java - 创建具有重复元素的列表

java - Netbeans 8.1 和 Checkstyle 插件

java - 多核对5ms处理页面的影响

jakarta-ee - 用于将 Quartz 与 CDI 一起使用的自定义 CDJobFactory

java - 如何安排代码执行?

java - Java代码中方法签名后禁止括号