quratz单元测试
前言:
写了一个简单的定时任务Demo,结果发现定时任务没有执行,代码如下
@Test public void test(){ try { //1.创建scheduler,调度器 Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); //2.定义一个Trigger,触发条件类 Trigger trigger = TriggerBuilder.newTrigger() .withIdentity("trigger1","group1")//定义name .startNow() .withSchedule(SimpleScheduleBuilder.simpleSchedule()//定义执行频率 .withIntervalInSeconds(1)//间隔一秒执行一次 .repeatForever())//一直执行 //定义结束时间 .endAt(new GregorianCalendar(2022,6,7,9,49,0).getTime()) .build(); //3.定义Job类,真正执行的逻辑 JobDetail job = JobBuilder.newJob(HelloQuartz.class) .withIdentity("job1","group1") .build(); //4.调度器中加入任务和触发器 scheduler.scheduleJob(job,trigger); System.out.println("------start-------------"); //5.启动任务调度 scheduler.start(); } catch (SchedulerException e) { e.printStackTrace(); } }
//定时调度具体执行的某件事 public class HelloQuartz implements Job { public HelloQuartz() { }; @Override public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { JobDetail jobDetail = jobExecutionContext.getJobDetail(); String jobName = jobDetail.getKey().getName(); String jobGroup = jobDetail.getKey().getGroup(); System.out.println("job执行,job:"+jobName+" group:"+jobGroup); } }
经过网上一系列查找,结果发现,调度器是寄生于主线程的,在调度任务启动之后,因为主线程立即退出,寄生于主线程的调度器也立即关闭,调度器中的任务也都相应销毁了,所以看不到调度器任务执行的效果。
有两种解决方案,一是使用@Test方法,但是主线程需要睡眠一段时间,可以通过Threa.currentThread.sleep()方法,使调度器任务可以执行。
二是直接在main方法中执行调度器任务,不适用测试@Test。