如何用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; } }