如何以编程方式创建触发器对象?

时间:2011-01-27 12:56:10

标签: spring quartz-scheduler scheduler

我使用的是Spring quartz Scheduler,但我没有使用XML文件。我想以编程方式创建整个配置。

我写了以下代码。

package com.eaportal.service.impl;

import java.text.ParseException;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import org.quartz.JobDetail;
import org.springframework.scheduling.SchedulingException;
import org.springframework.scheduling.quartz.CronTriggerBean;
import org.springframework.scheduling.quartz.JobDetailBean;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;

import com.eaportal.service.intfc.AuctionWinnerService;

public class NormalAuctionWinnerServiceImpl1 implements AuctionWinnerService {

    @SuppressWarnings("deprecation")
    public void declareWinner(int auctionId, Map<String, Object> parameterMap) {
        System.out.println("INSIDE DECLARE WINNER METHOD.");
        /** STEP 1 : INSTANTIATE TASK CLASS **/
        NormalAuctionWinnerTask1 runMeTask = new NormalAuctionWinnerTask1();
        System.out.println("FINISHED STEP 1");

        /** STEP 2 : INSTANTIATE JOB DETAIL CLASS AND SET ITS PROPERTIES **/
        Map<String,Object> jobDataAsMap = new HashMap<String,Object>();
        jobDataAsMap.put("runMeTask",runMeTask);
        JobDetailBean jdb = new JobDetailBean();
        jdb.setJobClass(NormalAuctionWinnerTask1.class);
        jdb.setJobDataAsMap(jobDataAsMap);
        System.out.println("FINISHED STEP 2");

        /** STEP 3 : INSTANTIATE CRON TRIGGER AND SET ITS PROPERTIES **/
        CronTriggerBean ctb = new CronTriggerBean();
        Date d1 = new Date();
        Date d2 = new Date();
        d2.setMinutes(d1.getMinutes()+10);
        ctb.setStartTime(d1);
        ctb.setEndTime(d2);
        ctb.setJobDetail(jdb);

        try {
            ctb.setCronExpression("59 * * * * ? *");
        } catch (ParseException e) {
            e.printStackTrace();
        }

        /** STEP 4 : INSTANTIATE SCHEDULER FACTORY BEAN AND SET ITS PROPERTIES **/
        SchedulerFactoryBean sfb = new SchedulerFactoryBean();
        sfb.setJobDetails(new JobDetail[]{jdb});
        try {
            sfb.start();
        } catch (SchedulingException e) {
            e.printStackTrace();
        }
    }

}

代码正常工作,但触发器没有触发因为我没有设置它。

这里的问题是在XML配置中我们有schedulerFactoryBean的'triggers'属性,我们使用list来配置我们的触发器。

但我无法以编程方式设置相同的属性。 SchedulerFactoryBean中有一个setTriggers方法,它接受一个Trigger数组 但是如何创造它就是问题所在。

我在最后4小时仍然没有成功的迹象。

有人可以帮助我吗?

由于

2 个答案:

答案 0 :(得分:8)

我能够成功地使用Spring Scheduling Framework完成此任务。

我知道这是一篇非常古老的帖子,但由于这个主题的内容很少,所以把它放在这里应该是个更好的主意。

第一篇文章的代码中的主要问题是afterPropertiesSet()对象和JobDetail对象上都没有调用CronTrigger。在准备好运行cron之前,afterProperties函数对输入的值进行一些处理。

此外,我使用了MethodInvokingJobDetailFactoryBean而不是常规jobDetail对象,因为它为我在给定类中的cron调用的函数提供了更大的灵活性。

这是我的代码:

package test.spring;

import org.quartz.JobDetail;
import org.quartz.Trigger;
import org.springframework.context.support.GenericApplicationContext;
import org.springframework.scheduling.SchedulingException;
import org.springframework.scheduling.quartz.CronTriggerBean;
import org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;

import java.text.ParseException;

public class ProgrammaticCron {

    public static void callWorkFlow() {
        System.out.println("Abhishek Jain");
    }

    public static void main (String[] args) {
        try {
            GenericApplicationContext applicationContext = new GenericApplicationContext();

            MethodInvokingJobDetailFactoryBean jdfb = new MethodInvokingJobDetailFactoryBean();
            jdfb.setTargetClass(ProgrammaticCron.class);
            jdfb.setTargetMethod("callWorkFlow");
            jdfb.setName("Trial program");
            jdfb.afterPropertiesSet();
            JobDetail jd = (JobDetail)jdfb.getObject();

            CronTriggerBean ctb = new CronTriggerBean();
            ctb.setJobDetail(jd);
            ctb.setName("Daily cron");
            ctb.setJobName(jd.getName());
            try {
                ctb.setCronExpression("59 * * * * ? *");
            } catch (ParseException e) {
                e.printStackTrace();
            }

            ctb.afterPropertiesSet();

            SchedulerFactoryBean sfb = new SchedulerFactoryBean();
            sfb.setJobDetails(new JobDetail[]{(JobDetail)jdfb.getObject()});
            sfb.setTriggers(new Trigger[]{ctb});
            sfb.afterPropertiesSet();
            try {
                sfb.start();
            } catch (SchedulingException e) {
                e.printStackTrace();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

afterProperties()很重要,可以从afterProperties的{​​{1}}实施中了解,如下所示:

SchedulerFactoryBean

正如您可能已经注意到的那样,所有诸如获取调度程序和使用触发器注册作业等任务都是作为此函数的一部分完成的。

答案 1 :(得分:-1)

主要问题应该是,您需要安排工作:

scheduler.scheduleJob(jobDetail, trigger);

我不知道Spring Quarz Beans是怎么回事,但正常的Quarz Jobs和Trigger必须有一个名字和一个小组!您可能需要启动调度程序:scheduler.start();

我已经修改了你的代码,它没有弹簧就可以工作,而且都省去了不需要的东西,以证明它是如何工作的:

包裹测试;

import java.text.ParseException;
import java.util.Date;

import org.quartz.CronTrigger;
import org.quartz.Job;
import org.quartz.JobDetail;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.impl.StdSchedulerFactory;


public class Demo {

    public static class TestJob implements Job{
        @Override
        public void execute(JobExecutionContext arg0) throws JobExecutionException {
            System.out.println("execute");          
        }
    }

    public static void declareWinner() throws SchedulerException, ParseException {

        JobDetail jobDetail = new JobDetail("job","group",Demo.TestJob.class);

        CronTrigger trigger = new CronTrigger("trigger","group");

        trigger.setStartTime(new Date());
        trigger.setEndTime(new Date(new Date().getTime() + 10 * 60 * 1000));
        trigger.setCronExpression("* * * * * ? *");     

        /** STEP 4 : INSTANTIATE SCHEDULER FACTORY BEAN AND SET ITS PROPERTIES **/
        SchedulerFactory sfb = new StdSchedulerFactory();
        Scheduler scheduler = sfb.getScheduler();       

        scheduler.scheduleJob(jobDetail, trigger);      

        scheduler.start();                  
    }

    public static void main (String[] args) throws SchedulerException, Exception {
        declareWinner();
        Thread.sleep(10000);
    }

}