package me.test.first.quartz; import java.net.URL; import java.net.URLClassLoader; import java.util.Date; import org.quartz.DateBuilder; import org.quartz.DateBuilder.IntervalUnit; import org.quartz.JobBuilder; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.quartz.SchedulerFactory; import org.quartz.SimpleScheduleBuilder; import org.quartz.Trigger; import org.quartz.TriggerBuilder; import org.quartz.impl.StdSchedulerFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class QuartzTestMain { Logger log = LoggerFactory.getLogger(QuartzTestMain.class); public void inserJobA() throws Exception { SchedulerFactory sf = new StdSchedulerFactory(); Scheduler sched = sf.getScheduler(); String schedId = sched.getSchedulerInstanceId(); // define the job and tie it to our HelloJob class JobDetail jobA = JobBuilder.newJob(HelloJob.class) .withIdentity("jobA", schedId).requestRecovery().build(); Trigger trigger = TriggerBuilder .newTrigger() .withIdentity("trigger1", schedId) .startAt(DateBuilder.futureDate(2, IntervalUnit.SECOND)) .withSchedule( SimpleScheduleBuilder.simpleSchedule() .withRepeatCount(20).withIntervalInSeconds(5)) .build(); } public void run() throws Exception { log.info("------- Initializing ----------------------"); // First we must get a reference to a scheduler SchedulerFactory sf = new StdSchedulerFactory(); Scheduler sched = sf.getScheduler(); log.warn("***** Deleting existing jobs/triggers *****"); sched.clear(); log.info("------- Initialization Complete -----------"); // computer a time that is on the next round minute Date runTime = DateBuilder.evenMinuteDate(new Date()); log.info("------- Scheduling Jobs -------------------"); String schedId = sched.getSchedulerInstanceId(); // define the job and tie it to our HelloJob class JobDetail job = JobBuilder.newJob(HelloJob.class) .withIdentity("job1", schedId).requestRecovery().build(); // Trigger the job to run on the next round minute Trigger trigger = TriggerBuilder .newTrigger() .withIdentity("trigger1", schedId) .startAt(DateBuilder.futureDate(2, IntervalUnit.SECOND)) .withSchedule( SimpleScheduleBuilder.simpleSchedule() .withRepeatCount(20).withIntervalInSeconds(5)) .build(); // Tell quartz to schedule the job using our trigger sched.scheduleJob(job, trigger); log.info(job.getKey() + " will run at: " + runTime); // Start up the scheduler (nothing can actually run until the // scheduler has been started) sched.start(); log.info("------- Started Scheduler -----------------"); // wait long enough so that the scheduler as an opportunity to // run the job! log.info("------- Waiting 65 seconds... -------------"); try { // wait 65 seconds to show job Thread.sleep(65L * 1000L); // executing... } catch (Exception e) { } // shut down the scheduler log.info("------- Shutting Down ---------------------"); sched.shutdown(true); log.info("------- Shutdown Complete -----------------"); } /* * 1. createDb * 2. insertJob * 3. startScheduleA * 4. startScheduleB * 5. stopScheduleA * 6. stopScheduleB */ public static void main(String[] args) throws Exception { String s = "AAA"; if (args.length > 0) { s = args[0]; } while (true) { System.out.println(s); Thread.sleep(1000); } } /** * Step1. 启动数据库。 Step2. 向数据库中插入定期job1。 Step3. 以 JVM1 启动job1,确认所有任务都在此JVM上执行。 * Step4. 以 JVM2 启动job1,确认任务分别有JVM1和JVM2执行。 Step5. 停止 JVM1。确认所有任务都在JVM2上运行。 * * 任务类别: 1. 能否并发。 2. 能否重复执行(错误恢复)。 3. 任务有先后顺序,有依赖性,时间依赖性。 4. * 开机自启动、指定间隔启动、指定cron日期启动。 * */ public static void main1(String[] args) throws Exception { ClassLoader sysClassLoader = ClassLoader.getSystemClassLoader(); URL[] urls = ((URLClassLoader) sysClassLoader).getURLs(); for (int i = 0; i < urls.length; i++) { System.out.println(urls[i].getFile()); } ApplicationContext appCtxt = new ClassPathXmlApplicationContext( "classpath:/applicationContext.xml"); QuartzTestMain example = new QuartzTestMain(); example.run(); } }