如何用quatz实现:按照cron定时执行Clazz类的M方法

package com.fhzz.vo;

import java.lang.reflect.Method;

import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

/**
 * quartz的Job的代理类
 *    既要实现Job接口,实现任务调度
 *    又要尽量减少代码入侵
 
 *
 */
public class ProxyJob implements Job{


    @Override
    public void execute(JobExecutionContext ctx) throws JobExecutionException {
        /**
         * 从上下文中获取dataMap,据此具体执行某个类的某个方法
         */
        JobDataMap jobDataMap = ctx.getJobDetail().getJobDataMap();
        Object bean=jobDataMap.get("clazzName");
        Method m=(Method) jobDataMap.get("methodName");
        //运用反射执行这个类的这个方法
        try {
            m.invoke(bean, new Object[] {});
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    
    }


}
package com.fhzz.service;

import java.lang.reflect.Method;
import java.text.ParseException;

import org.quartz.CronScheduleBuilder;
import org.quartz.JobBuilder;
import org.quartz.JobDataMap;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
import org.springframework.stereotype.Service;

import com.fhzz.entity.SchedulerJob;
import com.fhzz.vo.ProxyJob;

@Service
public class QuartazService {
    
    @Autowired
    private ApplicationContext context;
    
    @Autowired
    private  SchedulerFactoryBean schedulerFactoryBean;
    
    public  SchedulerJob addJob(String jobName,String clazzName,String methodName,String cron) throws SchedulerException, ParseException, ClassNotFoundException, NoSuchMethodException, SecurityException {
        SchedulerJob schedulerJob = new SchedulerJob();
        schedulerJob.setId(System.currentTimeMillis()+"");
        schedulerJob.setCron(cron);
        schedulerJob.setGroup(clazzName);
        schedulerJob.setTrigger(methodName);
        schedulerJob.setName(jobName);
        schedulerJob.setTriggerGroup(clazzName);
        return addJob(schedulerJob);
    }
    
    public  SchedulerJob addJob(SchedulerJob schedulerJob) throws SchedulerException, ClassNotFoundException, NoSuchMethodException, SecurityException {
        Scheduler scheduler = schedulerFactoryBean.getScheduler();
        //DSL方式创建JobDetail
        JobDetail jobDetail = JobBuilder.newJob(ProxyJob.class)
                        .withIdentity(schedulerJob.getId(), schedulerJob.getGroup())
                        .storeDurably(true)
                        .build();
        //放参数
        JobDataMap jobDataMap = jobDetail.getJobDataMap();
        /**这种方法有点问题,因为ProxyJob都是重新生成的**/
//        jobDataMap.put("clazzName", schedulerJob.getGroup());
//        jobDataMap.put("methodName", schedulerJob.getTrigger());
        /**换成直接转换成Object传过去**/
        // 实例
        Class cls = Class.forName(schedulerJob.getGroup());
        Object bean = context.getBean(cls);
        // 方法
        Method declaredMethod = cls.getDeclaredMethod(schedulerJob.getTrigger());
        jobDataMap.put("clazzName", bean);
        jobDataMap.put("methodName", declaredMethod);
        
        CronScheduleBuilder builder = CronScheduleBuilder.cronSchedule(schedulerJob.getCron());
        //DSL方式创建Trigger
        Trigger trigger = TriggerBuilder.newTrigger()
                .withIdentity(schedulerJob.getTrigger(), schedulerJob.getTriggerGroup()).startNow()
                .withSchedule(builder)
                .build();
        scheduler.start();
        scheduler.scheduleJob(jobDetail, trigger);
        return schedulerJob;
    }
    

}

 

posted on 2018-03-26 21:46  编世界  阅读(255)  评论(0编辑  收藏  举报