需要动态设置石英cron表达式



我在我的web应用程序(Servlet web应用程序)中使用石英。以下是quartz.properties文件和quartz.job.xml 的快照

四次属性

#===================================================
# Configure the Job Initialization Plugin
#===================================================
org.quartz.plugin.jobInitializer.class = org.quartz.plugins.xml.XMLSchedulingDataProcessorPlugin
org.quartz.plugin.jobInitializer.fileNames = jobs.xml
org.quartz.plugin.jobInitializer.failOnFileNotFound = true
org.quartz.plugin.jobInitializer.scanInterval = 10
org.quartz.plugin.jobInitializer.wrapInUserTransaction = false

<?xml version='1.0' encoding='utf-8'?>
<job-scheduling-data xmlns="http://www.quartz-scheduler.org/xml/JobSchedulingData"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.quartz-scheduler.org/xml/JobSchedulingData http://www.quartz-scheduler.org/xml/job_scheduling_data_1_8.xsd"
  version="1.8">
    <schedule>
        <job>
            <name>my-very-clever-job</name>
            <group>MYJOB_GROUP</group>
            <description>The job description</description>
            <job-class>com.acme.scheduler.job.ReportJob</job-class>
        </job>
        <trigger>
            <cron>
                <name>my-trigger</name>
                <group>MYTRIGGER_GROUP</group>
                <job-name>my-very-clever-job</job-name>
                <job-group>MYJOB_GROUP</job-group>
                <!-- trigger every night at 4:30 am -->
                <cron-expression>0 30 4 * * ?</cron-expression>
            </cron>
        </trigger>
    </schedule>
</job-scheduling-data>

按照这个顺序,每件事都很好。我需要允许用户按照他们想要的方式更改时间(cron表达式)。我的问题是如何动态地设置cron表达式。

CronTrigger cronTrigger = (CronTrigger) stdScheduler
                .getTrigger(triggerName,triggerGroupName);
CronTrigger newTriggerIns = new CronTrigger();
 newTriggerIns.setJobName(cronTrigger.getJobName());
 newTriggerIns.setName(triggerName);
 newTriggerIns.setCronExpression(newCronExpression);
 stdScheduler.rescheduleJob(triggerName,triggerGroupName,newTriggerIns);

在上面的例子中,取现有的触发器实例。创建一个新的触发器实例并设置cron表达式。

然后用新实例重新安排现有实例。

创建这样的新触发器是行不通的。

CronTrigger cronTrigger = (CronTrigger) stdScheduler.getTrigger(triggerName,triggerGroupName);
CronTrigger newTriggerIns = new CronTrigger();
newTriggerIns.setJobName(cronTrigger.getJobName());
newTriggerIns.setName(triggerName);
newTriggerIns.setCronExpression(newCronExpression);
stdScheduler.rescheduleJob(triggerName,triggerGroupName,newTriggerIns); //doesn't work

你只需要像这样编辑原始触发器:

CronTrigger cronTrigger = (CronTrigger) stdScheduler.getTrigger(triggerName,triggerGroupName);
cronTrigger.setCronExpression(newCronExpression);
stdScheduler.rescheduleJob(triggerName,triggerGroupName,cronTrigger);

使用Quartz api。以编程方式获取该触发器实例,将其强制转换为CronTrigger实例,并使用它的setCronExpression动态放置表达式。

最新更新