1. 程式人生 > >Spring3.1.2+Quartz 1.8.6動態新增持久化定時任務

Spring3.1.2+Quartz 1.8.6動態新增持久化定時任務

為什麼有這種需求?

  1. 每次增加定時任務都要修改配置檔案;
  2. 有些定時任務不一定是必須的,可以由運維人員去新增刪除或者修改執行時間什麼的,不可能每次都去改程式

程式環境:

Spring 3.1.2 、Quartz 1.8.6 其他版本沒有試過不過應該差別不大;

步驟:

總共4個操作:

1.1. 新建一個任務類,也就是具體幹活的類;

1.2.一個JobDetail類(儲存任務類);

1.3.一個Trigger類(儲存JobDetail和一些執行細節);

1.4.註冊Trigger;

其中涉及到在Spring中動態增加Bean的知識,有興趣的可以查詢相關資料;

/**
*任務類
**/
public class TestDemon {

	private static final Logger logger = LoggerFactory.getLogger(TestDemon.class);

	public void startWork() {
		logger.info("*********** working ***********");
	}
}

@Controller
public class TimerDemo {
    @Autowired
    private SchedulerFactoryBean schedulerFactoryBean;

    @RequestMapping(value = "/addTimer", method =  {
        RequestMethod.POST, RequestMethod.GET}
    )
    @ResponseBody
    public void addTimer() throws SchedulerException {
        Scheduler scheduler = schedulerFactoryBean.getScheduler();
       /*將TestDemo註冊到Spring*/
        BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(TestDemon.class);
        WebApplicationContext wac = ContextLoader.getCurrentWebApplicationContext();
        DefaultListableBeanFactory autowireCapableBeanFactory = (DefaultListableBeanFactory) wac.getAutowireCapableBeanFactory();
        autowireCapableBeanFactory.registerBeanDefinition("testDemo",beanDefinitionBuilder.getBeanDefinition());

        /* 將JobDetail註冊到Spring */
        beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(BeanInvokingJobDetailFactoryBean.class);
        beanDefinitionBuilder.addPropertyValue("targetBean", "testDemo");
        beanDefinitionBuilder.addPropertyValue("targetMethod", "startWork");
        autowireCapableBeanFactory.registerBeanDefinition("testBeanInvokeJobDetail", beanDefinitionBuilder.getBeanDefinition());
        /* 將Trigger註冊到Spring */
        beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(CronTriggerBean.class);
        beanDefinitionBuilder.addPropertyValue("cronExpression","0/10 * * * * ?");
        beanDefinitionBuilder.addPropertyValue("name", "test");
        beanDefinitionBuilder.addPropertyValue("group", "DEFAULT");
        beanDefinitionBuilder.addPropertyReference("jobDetail", "testBeanInvokeJobDetail");
        autowireCapableBeanFactory.registerBeanDefinition("testDemonTrigger", beanDefinitionBuilder.getBeanDefinition());
        /* 增加任務 */
        scheduler.scheduleJob((JobDetail) ContextLoader.getCurrentWebApplicationContext().getBean("testBeanInvokeJobDetail"),
                              (Trigger) ContextLoader.getCurrentWebApplicationContext().getBean("testDemonTrigger"));
    }
}