1. 程式人生 > >Quartz動態加載TASK

Quartz動態加載TASK

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