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。

posted @ 2022-07-07 10:01  远方的风景  阅读(367)  评论(0)    收藏  举报