Spring3.1.2+Quartz 1.8.6動態新增持久化定時任務
阿新 • • 發佈:2019-01-10
為什麼有這種需求?
- 每次增加定時任務都要修改配置檔案;
- 有些定時任務不一定是必須的,可以由運維人員去新增刪除或者修改執行時間什麼的,不可能每次都去改程式
程式環境:
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")); } }