Quartz動態加載TASK
阿新 • • 發佈:2017-07-12
reserve 修改方法 arraylist chang case rec ray span date
版權聲明:本文為博主原創文章,未經博主允許不得轉載。 <!-- 定時任務 --> <bean id="schedulerManager" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" <property name="triggers"> <list> <ref bean="quartzManagerTrigger" /> </list> </property> </bean> <!-- 主定時計劃 --> <bean id="quartzManagerTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean"> <property name="jobDetail" ref="quartzManagerJobDetail" /> <!-- 延時1秒 執行任務 --> <property name="startDelay" value="1000" /> <!-- 任務執行周期 6秒 --> <property name="repeatInterval" value="20000" /> </bean> <bean id="quartzManagerJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject" ref="quartzManagerBean" /> <property name="targetMethod" value="reScheduleJob" /> <property name="concurrent" value="false" /> </bean> <bean id="quartzManagerBean" class="com.jiuyu.batchServer.bussiness.reservedrpt.action.QuartzManager" init-method="initMethod"> <property name="scheduler" ref="schedulerManager" /> <property name="taskService" ref="taskService"/> </bean> public class QuartzManager implements BeanFactoryAware { @SuppressWarnings("unused") private void reScheduleJob() throws Exception, ParseException { // 通過查詢數據庫裏計劃任務來配置計劃任務 LOG.info("reScheduleJob---->"+new Date()); Map paramMap = new HashMap(); List paramList = new ArrayList(); paramList.add("0");//待運行 paramList.add("2");//待刪除 paramMap.put("paramList", paramList); List<TaskVo> quartzList = taskService.selectTaskIsNotDelete(paramMap);//查詢不為1和3的任務(已加入,已刪除) if (quartzList != null && quartzList.size() > 0) { for (TaskVo tbcq1 : quartzList) { configQuatrz(tbcq1); } } } public boolean configQuatrz(TaskVo tbcq) { boolean result = false; try { // 運行時可通過動態註入的scheduler得到trigger CronTriggerBean trigger = (CronTriggerBean) scheduler.getTrigger( String.valueOf(tbcq.getTaskId()), Scheduler.DEFAULT_GROUP); // 如果計劃任務已存在則調用修改方法 if (trigger != null) { change(tbcq, trigger); } else { // 如果計劃任務不存在並且數據庫裏的任務狀態為可用時,則創建計劃任務 if (tbcq.getState().equals("0")) { this.createCronTriggerBean(tbcq); } else { tbcq.setState("3");//已加入 taskService.updateTaskFile(tbcq); } } result = true; } catch (Exception e) { result = false; e.printStackTrace(); } return result; } public void change(TaskVo tbcq, CronTriggerBean trigger) throws Exception { // 如果任務為可用 if (tbcq.getState().equals("0")) { // 判斷從DB中取得的任務時間和現在的quartz線程中的任務時間是否相等 // 如果相等,則表示用戶並沒有重新設定數據庫中的任務時間,這種情況不需要重新rescheduleJob if (!trigger.getCronExpression().equalsIgnoreCase( tbcq.getExpression())) { trigger.setCronExpression(tbcq.getExpression()); scheduler.rescheduleJob(String.valueOf(tbcq.getTaskId()), Scheduler.DEFAULT_GROUP, trigger); } tbcq.setState("1");//已加入 taskService.updateTaskFile(tbcq); LOG.info(new Date() + ": 更新" + String.valueOf(tbcq.getTaskId()) + "計劃任務"); } else {//刪除 // 不可用 scheduler.pauseTrigger(String.valueOf(tbcq.getTaskId()), trigger.getGroup());// 停止觸發器 scheduler.unscheduleJob(String.valueOf(tbcq.getTaskId()), trigger.getGroup());// 移除觸發器 scheduler.deleteJob(String.valueOf(tbcq.getTaskId()), trigger.getJobGroup());// 刪除任務 tbcq.setState("3"); taskService.updateTaskFile(tbcq); LOG.info(new Date() + ": 刪除" + String.valueOf(tbcq.getTaskId()) + "計劃任務"); } } /** * 創建/添加計劃任務 * * @param tbcq * 計劃任務配置對象 * @throws Exception */ public void createCronTriggerBean(TaskVo tbcq) throws Exception { // 新建一個基於Spring的管理Job類 MethodInvokingJobDetailFactoryBean mjdfb = new MethodInvokingJobDetailFactoryBean(); mjdfb.setName(String.valueOf(tbcq.getTaskId()));// 設置Job名稱 // 如果定義的任務類為Spring的定義的Bean則調用 getBean方法 if ("1".equals(tbcq.getIsspringbean())) { mjdfb.setTargetObject(beanFactory.getBean(tbcq.getClassName()));// 設置任務類 } else { // 否則直接new對象 mjdfb.setTargetObject(Class.forName(tbcq.getClassName()) .newInstance());// 設置任務類 } Object[] arguments = new Object[1]; arguments[0] = tbcq; mjdfb.setArguments(arguments); mjdfb.setTargetMethod(tbcq.getMethod());// 設置任務方法 //mjdfb.setConcurrent(tbcq.getConcurrent().equals("0") ? false : true); // 設置是否並發啟動任務 mjdfb.setConcurrent(false);//不並發 mjdfb.afterPropertiesSet();// 將管理Job類提交到計劃管理類 // 將Spring的管理Job類轉為Quartz管理Job類 JobDetail jobDetail = new JobDetail(); jobDetail = (JobDetail) mjdfb.getObject(); jobDetail.setName(String.valueOf(tbcq.getTaskId())); scheduler.addJob(jobDetail, true); // 將Job添加到管理類 // 新一個基於Spring的時間類 CronTriggerBean c = new CronTriggerBean(); c.setCronExpression(tbcq.getExpression());// 設置時間表達式 c.setName(String.valueOf(tbcq.getTaskId()));// 設置名稱 c.setJobDetail(jobDetail);// 註入Job c.setJobName(String.valueOf(tbcq.getTaskId()));// 設置Job名稱 scheduler.scheduleJob(c);// 註入到管理類 scheduler.rescheduleJob(String.valueOf(tbcq.getTaskId()), Scheduler.DEFAULT_GROUP, c);// 刷新管理類 tbcq.setState("1");//已加入 taskService.updateTaskFile(tbcq); LOG.info(new Date() + ": 新建" + String.valueOf(tbcq.getTaskId()) + "計劃任務"); } public void setBeanFactory(BeanFactory factory) throws BeansException { this.beanFactory = factory; } public BeanFactory getBeanFactory() { return beanFactory; } }
Quartz動態加載TASK