文档章节

Quartz的搭建、应用(单独使用Quartz)

Zero零_度
 Zero零_度
发布于 2016/07/27 18:10
字数 956
阅读 118
收藏 5

Quartz在Java构建的系统中,是十分常用的定时任务框架。

本文,记录、介绍Quartz的简单入门的单独搭建(此文入门学习Quartz为主,并非基于Spring托管形式)。

 

> 参考的优秀资料

Quartz Quick Start Guide

Chapter 3: Logback configuration

 

> 版本说明

除了Quartz,还引入logback(为了看详细的日志嘛!)

View Code

 

> 简单的搭建

jar包的引入参考上述的pom文件。

 

quartz.properties,配置quartz的设置。

,org.quartz.threadPool.threadCount,配置线程池的容量,即表示同时最多可运行的线程数量。在生产环境,此参数应根据实际情况配置。

View Code

 

logback.xml,日志框架logback的配置。这里只简单地配置了控制台和日志文件的输出哦(>_<)

View Code

 

HelloJob.java,具体执行的任务

复制代码

package No01简单的定时任务;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class HelloJob implements Job {
    
    Logger logger = LoggerFactory.getLogger(this.getClass());

    @Override
    public void execute(JobExecutionContext arg0) throws JobExecutionException {
        // 此任务仅打印日志便于调试、观察
        this.logger.debug(this.getClass().getName() + " trigger...");
    }

}

复制代码

 

那么,在哪里定义“在什么时候执行什么任务呢?”

复制代码

package No01简单的定时任务;

import java.util.concurrent.TimeUnit;

import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
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;


public class Bootstrap {
    private static Logger logger = LoggerFactory.getLogger(Bootstrap.class);

    public static void main(String[] args) {

        try {
            // 获取Scheduler实例
            Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
            scheduler.start();

            // 具体任务
            JobDetail job = JobBuilder.newJob(HelloJob.class).withIdentity("job1", "group1").build();

            // 触发时间点
            SimpleScheduleBuilder simpleScheduleBuilder = SimpleScheduleBuilder.simpleSchedule()
                    .withIntervalInSeconds(5).repeatForever();
            Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1")
                    .startNow().withSchedule(simpleScheduleBuilder).build();

            // 交由Scheduler安排触发
            scheduler.scheduleJob(job, trigger);
            
            /* 为观察程序运行,此设置主程序睡眠3分钟才继续往下运行(因下一个步骤是“关闭Scheduler”) */
            try {
                TimeUnit.MINUTES.sleep(3);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            // 关闭Scheduler
            scheduler.shutdown();

        } catch (SchedulerException se) {
            logger.error(se.getMessage(), se);
        }
    }

}

复制代码

 

> 在Web应用中使用Quartz

Quartz也常用在Web应用中,常见的是交由Spring托管的形式,但这里并非介绍这个。这里介绍Quartz在Web应用中单独使用。

 

一般来说,Web应用启动时,应注册已经确定的定时任务;一些动态的、未确定触发时间的定时任务,后续可通过静态的Scheduler注册。

这里使用监听器在应用启动时注册,记得在web.xml注册这个监听器哦(>_<);在关闭Web应用时,也要相应的注销定时任务。

其他配置文件、Java类与上例子相同,这里只是注册定时任务的地方换成此监听器了。

复制代码

package No02Web应用使用Quartz;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
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 No01简单的定时任务.HelloJob;

/**
 * Application Lifecycle Listener implementation class AListener
 *
 */
public class ApplicationContextListener implements ServletContextListener {
    
    private Logger logger = LoggerFactory.getLogger(this.getClass());
    
    public static Scheduler scheduler = null;

    @Override
    public void contextInitialized(ServletContextEvent arg0) {
        this.logger.info("The application start...");
        
        /* 注册定时任务 */
        try {
            // 获取Scheduler实例
            scheduler = StdSchedulerFactory.getDefaultScheduler();
            scheduler.start();

            // 具体任务
            JobDetail job = JobBuilder.newJob(HelloJob.class).withIdentity("job1", "group1").build();

            // 触发时间点
            SimpleScheduleBuilder simpleScheduleBuilder = SimpleScheduleBuilder.simpleSchedule()
                    .withIntervalInSeconds(5).repeatForever();
            Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1")
                    .startNow().withSchedule(simpleScheduleBuilder).build();

            // 交由Scheduler安排触发
            scheduler.scheduleJob(job, trigger);
            
            this.logger.info("The scheduler register...");
        } catch (SchedulerException se) {
            logger.error(se.getMessage(), se);
        }
    }
    
    @Override
    public void contextDestroyed(ServletContextEvent arg0) {
        this.logger.info("The application stop...");
        
        /* 注销定时任务 */
        try {
            // 关闭Scheduler
            scheduler.shutdown();
            
            this.logger.info("The scheduler shutdown...");
        } catch (SchedulerException se) {
            logger.error(se.getMessage(), se);
        }
    }

}

复制代码

 

<listener>
        <listener-class>No02Web应用使用Quartz.ApplicationContextListener</listener-class>
    </listener>

 

,如果你在Eclipse中调试,可能发现无法看到contextDestroyed方法的执行,请注意用Stop方式(图一)关闭应用,而不是Terminate(图二)。

图一

 

图二

 

> 常用的Cron Schedule

相对于其他方式定义定时任务的触发时间,我们较常用Cron Schedule,小伙伴们也是吧?

 

Cron Schedule的使用

复制代码

// 具体任务
JobDetail job = JobBuilder.newJob(HelloJob.class).withIdentity("job1", "group1").build();

// 触发时间点
CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule("0 * * * * ? *");
Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1")
        .withSchedule(cronScheduleBuilder).build();

// 交由Scheduler安排触发
scheduler.scheduleJob(job, trigger);

复制代码

 

而Cron Expression的学习可参考下列优秀的文章:

Tutorial - Lesson 6: CronTrigger

Spring - Quartz - cronExpression中问号(?)的解释

本文转载自:http://www.cnblogs.com/nick-huang/p/4848843.html

Zero零_度
粉丝 69
博文 1267
码字总数 263854
作品 0
程序员
私信 提问
解决Quartz定时任务被触发两次的问题(附带:Quartz的测试用例)

很多人在使用spring的Quartz配置定时任务时,会发现每次定时时间到达后,指定的定时方法同时执行了两次。 (P.S. 本人项目用的Jfinal搭建,同样出现该问题。) 解决quartz定时任务被触发两次的...

EugeneQiu
2014/05/15
16K
17
quartz集群

其实主要还是借鉴别人的东东,写的还挺好的。我自己只在最后说说自己遇到的坑吧。 1、Quartz任务调度的基本实现原理   Quartz是OpenSymphony开源组织在任务调度领域的一个开源项目,完全基...

梦蝶飘雪
2016/08/12
363
0
Terracotta收购Quartz开源调度框架

  【IT168 资讯】3个月前,Terracotta收购了Ehcache。   近日,著名的开源java 集群软件开发商Terracotta宣布收购开源的调度框架-Quartz。它是OpenSymphony开源组织在Job scheduling领域...

IT168网站
2009/11/23
0
0
Quartz.net 定时任务之简单任务

一、概述   1、quartz.net 是一款从java quartz 上延伸出来的定时任务框架。     2、我在网上看到很多大神写过关于quartz.net 的博客、文章等,在这些博客文章里也学会了很多关于quart...

llljj96
2017/05/23
0
0
OA现金盘源码搭建与Quartz简单使用

一. 什么是Quartz? 简介: 定时任务调度的框架, 可以在框架中放入很多个应用程序(重点关注的是应用程序的编写) OA现金盘源码搭建QQ:2152876294 网址diguaym.com 使用场景: 闹钟 账单提醒 核心...

cbjsih
2018/08/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

JS--function

一、声明提前(hoist) 在js程序开始执行前,引擎会查找所有var声明的变量和function声明的函数,集中到当前作用域顶部集中创建,赋值留在原地 二、三种创建函数的方式 1、声明方式创建函数-...

wytao1995
今天
4
0
微服务之间调用控制器注解类型的差异

今天在一个业务服务通过Feign调用文件服务上传文件时遇到了几个问题: 1. 提示http请求头过大的问题; 此时需要修改bootstrap.yml,加入 server: max-http-header-size: 10000000 用以放大...

不再熬夜
今天
6
0
用 4G 工作是什么体验

七月开始,因为工作原因,在公司附近租了个住处,方便工作。离公司近了,感觉就是不一样,之前每天 5:30 就要起床赶地铁,现在可以睡到自然醒,一看才 7 点,悠闲的起床洗漱,踱步到公司,都...

zzxworld
今天
6
0
sonar报错volatile

问题发生 原先代码如下: //认证授权码private static volatile String AUTHORIZATION_CODE = "init"; git push 之后,sonar认为这是个bug检测报告截图如下: 分析排查 解释说明: Markin...

开源小菜鸟2333
今天
5
0
《Java实践指南》--读后

闲读《Java实践指南》... 1.lvy 某些项目中能够看到ivy.xml。早期使用ant的项目中,常常用ivy.xml来下载项目依赖。 2.ant 作为java程序员,应该都知道ant,虽然可能用过的人不多。为什么ant...

RippleChan
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部