用Quartz实现定时任务

本文介绍如何使用Quartz调度器创建自动执行的任务。通过示例展示了如何在Java应用中设置和运行定时任务,包括初始化调度器、定义作业及触发器等关键步骤。
你曾经需要应用执行一个任务吗?这个任务每天或每周星期二晚上11:30,或许仅仅每个月的最后一天执行。一个自动执行而无须干预的任务在执行过程中如果 发生一个严重错误,应用能够知到其执行失败并尝试重新执行吗?你和你的团队是用java编程吗?如果这些问题中任何一个你回答是,那么你应该使用 Quartz调度器。 旁注:Matrix目前就大量使用到了Quartz。比如,排名统计功能的实现,在Jmatrix里通过Quartz定义了一个定时调度作业,在每天凌晨一点,作业开始工作,重新统计大家的Karma和排名等。 还有,RSS文件的生成,也是通过Quartz定义作业,每隔半个小时生成一次RSS XML文件。        Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个, 甚至是好几万个Jobs这样复杂的日程序表。Jobs可以做成标准的Java组件或 EJBs。        http://www.opensymphony.com/quartz/

从下载连接取得Quartz的发布版本,并且解压到到本地 目录。这个下载文件包含了一个预先构建好的Quartz二进制文件(quartz.jar),你可以将它放进自己的应用中。Quartz框架只需要少数的 第三方库,并且这些三方库是必需的,你很可能已经在使用这些库了。

你要把Quartz的安装目录的

quartz.properties文件

Quartz有一个叫做 quartz.properties的配置文件,它允许你修改框架运行时环境。缺省是使用Quartz.jar里面的quartz.properties 文件。当然,你应该创建一个quartz.properties文件的副本并且把它放入你工程的classes目录中以便类装载器找到它。 quartz.properties样本文件如例1所示。

例1.quartz.properties文件允许修改Quartz运行环境:

一旦将Quartz.jar文件和第三方库加到自己的工程里面并且quartz.properties文件在工程的classes目录中,就可以创建作业了。

1. 在web.xml里面加上

            package.ContextListener

这样就可以在部署的时候启动定时器。

package.ContextListener.java

package package;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import org.quartz.SchedulerException;

public class ContextListener implements ServletContextListener {

Runner qRunner = null;
    public void contextInitialized(ServletContextEvent arg0) {
        // init job
        // start schedule task
        try {
            qRunner = new Runner();
            qRunner.task();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void contextDestroyed(ServletContextEvent arg0) {
        try {
           // stop task
            qRunner.stop();

        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }
}
Runner.java

import org.quartz.CronExpression;

import org.quartz.CronTrigger;

import org.quartz.JobDetail;

import org.quartz.Scheduler;

import org.quartz.SchedulerException;

import org.quartz.SchedulerFactory;

import org.quartz.impl.StdSchedulerFactory;



/**

 */

public class Runner {



    static Scheduler scheduler = null;



    public void task() throws SchedulerException {

        // Initiate a Schedule Factory

        SchedulerFactory schedulerFactory = new StdSchedulerFactory();

        // Retrieve a scheduler from schedule factory

        scheduler = schedulerFactory.getScheduler();



        // current time

        long ctime = System.currentTimeMillis();



        // Initiate JobDetail with job name, job group, and executable job class

        JobDetail jobDetail = new JobDetail("jobDetail1", "jobDetailGroup1",

                YourScheduleJob.class);

        // Initiate CronTrigger with its name and group name

        CronTrigger cronTrigger = new CronTrigger("cronTrigger",

                "triggerGroup1");

        try {

            // setup CronExpression

            CronExpression cexp = new CronExpression("0/180 * * * * ?");

            // Assign the CronExpression to CronTrigger

            cronTrigger.setCronExpression(cexp);

        } catch (Exception e) {

            e.printStackTrace();

        }

        // schedule a job with JobDetail and Trigger

        scheduler.scheduleJob(jobDetail, cronTrigger);



        // start the scheduler

        scheduler.start();

    }



    public void stop() throws SchedulerException {

        scheduler.shutdown();

    }

public static void main(String args[]) {

        try {

            Runner qRunner = new Runner();

            qRunner.task();

        } catch (Exception e) {

            e.printStackTrace();

        }

    }



}
YourScheduleJob.java

import java.util.Date;



import org.quartz.Job;

import org.quartz.JobExecutionContext;

import org.quartz.JobExecutionException;



public class YourScheduleJob implements Job {

    

    public void execute(JobExecutionContext context) throws JobExecutionException {

        System.out.println("In SimpleQuartzJob - executing its JOB at "

                + new Date() + " by " + context.getTrigger().getName());

       

        // your job here

       

    }



}
具体配置可以参见:http://whj0427.javaeye.com/blog/142680或者见Reg_login
也可以参见这里:http://yahaitt.javaeye.com/blog/122720进行非Web运用。
代码见我的资源

### Java Quartz 定时任务实现教程 Quartz 是一种功能强大的调度框架,可以用来创建简单的或复杂的调度作业。以下是关于如何在 Java 中使用 Quartz 库来实现定时任务的详细介绍。 #### 1. 添加依赖项 为了使用 Quartz,在项目中需要引入相应的 Maven 或 Gradle 依赖项。以下是 Maven 的配置示例: ```xml <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.3.2</version> </dependency> ``` 如果使用 Spring 集成,则还需要添加以下依赖项: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </version>2.7.0</version> </dependency> ``` --- #### 2. 创建 Job 类 Job 是 Quartz 调度的核心组件之一,表示要执行的任务逻辑。可以通过继承 `org.quartz.Job` 接口并重写其方法来定义具体的业务逻辑。 ```java import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; public class MyJob implements Job { @Override public void execute(JobExecutionContext context) throws JobExecutionException { System.out.println("定时任务正在运行..."); // 可在此处编写具体业务逻辑 } } ``` 上述代码展示了如何通过自定义类实现 `execute()` 方法完成特定操作[^4]。 --- #### 3. 配置 JobDetail 和 Trigger JobDetail 描述了任务的具体细节,而 Trigger 则决定了任务何时以及如何触发。 ##### 使用标准 API 配置 下面是一个不借助任何框架的手动配置方式: ```java import org.quartz.*; import static org.quartz.SimpleScheduleBuilder.*; public class QuartzExample { public static void main(String[] args) throws SchedulerException { // Step 1: Define the job and tie it to our MyJob class. JobDetail job = JobBuilder.newJob(MyJob.class) .withIdentity("myJob", "group1") // Name "myJob", Group "group1" .build(); // Step 2: Create a trigger that fires every hour starting now. Trigger trigger = TriggerBuilder.newTrigger() .withIdentity("myTrigger", "group1") .startNow() .withSchedule(simpleSchedule().withIntervalInHours(1).repeatForever()) .build(); // Step 3: Schedule the job with a scheduler. Scheduler scheduler = new StdSchedulerFactory().getScheduler(); scheduler.start(); scheduler.scheduleJob(job, trigger); } } ``` 此代码片段说明了如何手动设置一个每小时重复一次的任务[^3]。 --- #### 4. 结合 Spring Boot 进行集成 Spring 提供了更简洁的方式管理 Quartz Jobs。例如,可以直接利用 `MethodInvokingJobDetailFactoryBean` 来简化 Job 的声明过程[^1]。 ##### 示例:基于 XML 配置文件的方法 ```xml <bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject" ref="taskService"/> <property name="targetMethod" value="performTask"/> </bean> <bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean"> <property name="jobDetail" ref="jobDetail"/> <property name="startDelay" value="0"/> <property name="repeatInterval" value="60000"/> <!-- 每分钟 --> </bean> <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">[^2] <property name="triggers"> <list> <ref bean="simpleTrigger"/> </list> </property> </bean> ``` 以上配置实现了调用服务中的某个方法作为定时任务的功能。 --- #### 5. 动态调整 Cron 表达式 CronTriggers 更加灵活,允许按照指定的时间模式触发任务。例如每天凌晨两点执行某任务: ```java String cronExpression = "0 0 2 * * ?"; // 每天凌晨2点触发 Trigger cronTrigger = TriggerBuilder.newTrigger() .withIdentity("cronTrigger", "group1") .withSchedule(CronScheduleBuilder.cronSchedule(cronExpression)) .build(); scheduler.scheduleJob(job, cronTrigger); ``` --- ### 总结 Quartz 提供了一种强大且灵活的方式来处理各种类型的定时任务需求。无论是简单的一次性任务还是复杂周期性的任务都可以轻松实现
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值