使Spring Quartz Job Scheduler运行用户操作

时间:2014-02-26 10:18:48

标签: java spring quartz-scheduler

我正在使用Spring Quartz Job Scheduler,以便在用户选定的日期内运行作业。在应用程序启动时我不需要自动调用作业调度程序,而是需要作业调度程序开始运行特定的用户操作

<bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
      <property name="triggers">
            <list>
            <ref bean="testme"/>
           </list>
      </property>     
</bean>

<bean id="testme" class="org.springframework.scheduling.quartz.CronTriggerBean">
        <property name="jobDetail">
            <ref bean="testme1"/>
        </property>
        <property name="cronExpression">
            <value>0 15 10 1,15 * ?</value>  
        </property>
</bean>

此外,我需要先让用户选择运行作业所需的日期,例如:星期一和星期五,然后点击提交按钮后,调度程序将从该点开始?所以它的cronExpression值也会根据用户选择的日期而改变。更多用户以后可以将其更改为不同的日期。那么有可能做到这一点,或者Quartz Job Scheduler不是实现我需要的方法吗?

2 个答案:

答案 0 :(得分:0)

尝试以编程方式获取CronTriggerBean对象testme 并在其中设置所需的cronExpression。我认为这应该有效。

答案 1 :(得分:0)

调度程序将在启动时运行。正如Julien所提到的,关键是在用户采取行动时创建作业或触发器。

  

更多用户以后可以将其更改为不同的日期。它就是这样   可能这样做或Quartz Job Scheduler不是这种方法   实现我的需求?

Quartz可以做到这一点。你只需要重新安排工作。

您可以将SchedulerFactoryBean的实例自动装配到您自己的bean中。从SchedulerFactoryBean,您可以获取调度程序并根据需要调整作业的触发器或创建新的作业/触发器:

Scheduler scheduler = schedulerFactory.getScheduler();
JobDetail job = scheduler.getJobDetail("yourJobName", "yourJobGroup");

// possibly do some stuff with the JobDetail...

// get the current trigger
CronTrigger cronTrigger = (CronTrigger) scheduler.getTrigger("yourTriggerName", "yourTriggerGroupName");

// possibly do some stuff with the current Trigger...
if (cronTrigger != null)
   something.doSomeStuff();

// replace the old trigger with a new one.  unless your users are sysadmins, they
// probably don't want to enter cron-type entries.  there are other trigger types
// besides CronTrigger. RTFM and pick the best one for your needs
CronTrigger newTrigger = new CronTrigger();
newTrigger.setName("newTriggerName");
newTrigger.setGroup("yourTriggerGroup");
newTrigger.setCronExpression("valid cron exp here");

// the new trigger must reference the job by name and group
newTrigger.setJobName("yourJobName");
newTrigger.setJobGroup("yourJobGroup");

// replace the old trigger.  this is by name, make sure it all matches up.
scheduler.rescheduleJob("yourJobName",  "yourTriggerGroup", newTrigger);