如何解决定时任务的问题

157 阅读1分钟

前言

我们工作中常常会遇到需要设置在某个时间再开始执行某一任务的需求,这时就会使用到定时任务调度框架,例如 Quartz,因此今天带大家了解一下 Quartz 框架的使用。

导入依赖

<dependencies>
    <!--Quartz任务调度-->
    <!-- https://mvnrepository.com/artifact/org.quartz-scheduler/quartz -->
    <dependency>
        <groupId>org.quartz-scheduler</groupId>
        <artifactId>quartz</artifactId>
        <version>2.2.3</version>
    </dependency>
</dependencies>

定义Job

Job是工作类的具体实现,即需要定时执行的“某件事”

public class HelloQuartz implements Job {
    //执行
    public void execute(JobExecutionContext context) throws JobExecutionException {
         //创建工作详情
        JobDetail jobDetail=context.getJobDetail();
        //获取工作的名称
        String jobName = jobDetail.getKey().getName();//任务名
        String jobGroup = jobDetail.getKey().getGroup();//任务group
        System.out.println("job执行,job:"+jobName+" group:"+jobGroup);
        System.out.println(new Date());
    }
}

进行API测试

public class TestHelloQuartz {

    public static void main(String[] args) throws Exception {
        // quartz API
        // 1. 调度器Scheduler
        Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();

        // 2. 触发器:
        CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1")
                .withSchedule(CronScheduleBuilder.cronSchedule("* * * * * ?")) 
                .build();

        // 3. JobDetail, 任务详情, 具体执行的业务内容
        JobDetail jobDetail = JobBuilder.newJob(HelloQuartz.class).withIdentity("job1", "group1").build();

        // 4. 将 JobDetail 和触发器 增加到调度器中
        scheduler.scheduleJob(jobDetail,trigger);

        // 5. 启动,调度器开始工作
        scheduler.start();
    }
}

配置

创建定时器资源配置文件, quartz.properties

# 名为:quartz.properties,放置在classpath下,如果没有此配置则按默认配置启动
# 指定调度器名称,非实现类
org.quartz.scheduler.instanceName = DefaultQuartzScheduler
# 指定线程池实现类
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
# 线程池线程数量
org.quartz.threadPool.threadCount = 10 
# 优先级,默认5
org.quartz.threadPool.threadPriority = 5
# 非持久化job
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore

核心类说明

Scheduler:调度器。所有的调度都是由它控制,是Quartz的大脑,所有任务都是由它来管理

Job:任务,想定时执行的事情(定义业务逻辑)

JobDetail:基于Job,进一步包装。其中关联一个Job,并为Job指定更详细的属性,比如标识等

Trigger:触发器。可以指定给某个任务,指定任务的触发机制。