quartz定时任务使用

spring quartz(定时任务例子)
一.Quartz介绍
     Quartz是一个作业调度系统(a job scheduling system),负责在约定的时间到达时执行(或通知)其他软件控制。是一个Java的定时任务框架,使用它可以方便的实现计划任务,即在某个时间或每隔一定时间运行一个任务。Quartz的核心是Job/JobDetail,Trigger和Scheduler。

    1.Job/JobDetail
       Job/JobDetail=既要执行的任务,可以通过实现Job(interface)中的excute方法来指定任务的具体操作。 他描述了一个任务具体的信息,比如名称,组名等等。JobDetail对象是在Quartz的客户端(我们的程序)在Job被关联加入到Scheduler时创建的,JobDetail包含了Job的各种属性值和   JobDataMap,JobDataMap中存放了与之相关的Job类实例的状态信息。

    2.Trigger
       用于控制一组Job的触发,包裹SimmperTrigger和CronTrigger,后者支持一种描述触发事件和间隔的表达式语言。Quartz有个很好的想法就是分离了任务和任务执行的条件。Trigger就是控制任务执行条件的类,当Trigger认为执行条件满足的时刻,Trigger会通知相关的Job去执行。分离的好处是:
            1).你可以为某个Job关联多个Trigger,其中任何一个条件满足都可以触发job执行,这样可以完成一些组合的高级触发条件
            2).当Trigger失效后(比如:一个永远都不能满足的条件),你不必去声明一个新的job,代替的是你可以为job关联一个新的Trigger让job可以继续执行。
  
    3.Scheduler是控制和管理触发器的启动和终止。
       使用Scheduler前必须实例化Scheduler,需要由SchedulerFactory类来创建Scheduler,Factory的实例可以通过在JNDI存储中的Factory的序列化的方式获取,实例化Factory后直接使用该实例很容易。如下:
       public class WangyouQuartzListener extends QuartzInitializerListener {
            public  static  SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");

            public WangyouQuartzListener() {
                       super();
            }

           public void contextInitialized(ServletContextEvent event) {
                    super.contextInitialized(event);
                    String factoryKey = event.getServletContext().getInitParameter("servlet-context-factory-key");
                     if (factoryKey == null) {
                               factoryKey = QUARTZ_FACTORY_KEY;
                      }
                      StdSchedulerFactory factory = (StdSchedulerFactory) event.getServletContext().getAttribute(factoryKey);

                   try {
                         QuartzScheduleHolder.getInstance().setScheduler(factory.getScheduler());
                       //per 2 hours add friends
                       Trigger trigger =  TriggerUtils.makeHourlyTrigger(24);
                       //Trigger trigger =  TriggerUtils.makeSecondlyTrigger(60);
                       trigger.setName(AddNewUserFriendJobDetail.JOB_NAME);
                      trigger.setStartTime(this.getBeforeAfterDate(1,-13));
                      QuartzScheduleHolder.getInstance().getScheduler().scheduleJob(new AddNewUserFriendJobDetail(),trigger);
                      //把job和Trigger关联,这样当Trigger认为应该触发的时候就会调用(实际上是Scheduler调用)job.execute方法了。

                      //per 3 day send mail and leave message
                      Trigger trigger2 =  TriggerUtils.makeHourlyTrigger(24*3);
                      trigger2.setStartTime(this.getBeforeAfterDate(1,-12));
                      trigger2.setName(LeaveMessageNewUserJobDetail.JOB_NAME);
                      QuartzScheduleHolder.getInstance().getScheduler().scheduleJob(new LeaveMessageNewUserJobDetail(),trigger2);

                       // per 6  recommend video
                      Trigger trigger3 =  TriggerUtils.makeHourlyTrigger(24*7);
                      trigger3.setName(RecommendVideoNewUserJobDetail.JOB_NAME);
                      trigger3.setStartTime(this.getBeforeAfterDate(2,-11));
                      QuartzScheduleHolder.getInstance().getScheduler().scheduleJob(new RecommendVideoNewUserJobDetail(),trigger3);

           
                         QuartzScheduleHolder.getInstance().getScheduler().start();
                   } catch (Exception e) {
                        e.printStackTrace();
                   }
              }

             public void contextDestroyed(ServletContextEvent event) {
                   super.contextDestroyed(event);
                     QuartzScheduleHolder.getInstance().setScheduler(null);
             }

              private Date getBeforeAfterDate( int day,int hour){
                       Calendar   cal   =   Calendar.getInstance();
                      cal.add(Calendar.DATE,day);
                     cal.add(Calendar.HOUR,hour);
                     return cal.getTime();
             }
           }
二。Spring Quartz
      Spring的scheduling。quartz包中对Quartz的框架进行封装,使得开发时不用写任何Quartz和Spring的代码就可以实现定时任务。Spring通过JobDetailBean,MethodInvokingJobDetailFactoryBean实现Job的定义,后者更加使用,只需指定要运行的类,和该类中运行的方法即可,Spring将自动生成符合Quartz要求的JobDetail。例如:
      1.jobDetail
         public class SayHelloJob {
   
                   private static  DateFormat dateFormat =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

                   private String message;

                   public String getMessage() {
                           return message;
                  }

                  public void setMessage(String message) {
                            this.message = message;
                 }

                 public void sayHello(){
                          Date date = new Date();
                         System.out.println(dateFormat.format(date)+" :"+this.getMessage() );
                 }
          }
       2.spring的配置文件:quartzbean.xml
           <?xml version="1.0" encoding="UTF-8"?>

           <beans xmlns="http://www.springframework.org/schema/beans"
                    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
                    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

                    <bean name="sayHelloJob" class="com.fg114.takeout.job.SayHelloJob">
                              <property name="message" value="start .............." />
                   </bean>

                   <bean name="sayHelloDetailBean" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
                              <property name="targetObject" ref="sayHelloJob" />
                             <property name="targetMethod" value="sayHello"/>
                    </bean>

                   <bean name="simpleTriggerBean" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
                                  <!--这里定义定时任务的对象的位置-->
                            <property name="jobDetail" ref="sayHelloDetailBean"/>
                           <!--这里定义每六秒钟程序执行一次-->
                             <property name=""></property>
                            <property name="repeatInterval" value="6000"/>
                           <!--这里定义程序启动两秒钟后开始执行-->
                         <property name="startDelay" value="2000"/>
                    </bean>
                 <! --          启动任务    -->
                   <bean name="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
                         <property name="triggers">
                             <list>
                                  <ref bean="simpleTriggerBean"/>
                            </list>
                       </property>
                  </bean>
             </beans>
3.web.xml :
            加入
           <listener>
             <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
           </listener>
       注意:common-collections.jar 版本布不能是2.1版本的

<think> 我们被要求提供Java中Quartz定时任务使用指南。根据引用内容,Quartz是一个开源的作业调度库,允许开发者通过预定义的时间表执行计划任务。我们将结合引用内容,按照通常的使用步骤来组织回答。 步骤概述(参考引用[4]): 1. 创建任务类:实现Job接口,定义任务的执行逻辑。 2. 配置调度器:创建并配置Scheduler实例。 3. 定义任务细节:创建JobDetail对象,指定任务类及其参数。 4. 定义触发器:创建Trigger对象,指定任务的触发条件。 5. 启动调度器:将任务细节和触发器注册到调度器,并启动调度器。 另外,引用[5]提到可以通过Spring的依赖注入和Bean管理来声明式配置这些组件,因此我们也会简要提及Spring集成的方式。 但注意,用户没有特别说明是否使用Spring,因此我们先给出原生Quartz使用方法,再简要提一下Spring集成。 详细步骤: 1. 创建任务类(Job): 实现org.quartz.Job接口,并重写execute方法(引用[3]示例)。 2. 配置调度器(Scheduler): 调度器由SchedulerFactory创建,通常使用StdSchedulerFactory。 3. 定义任务细节(JobDetail): 使用JobBuilder来定义JobDetail,指定任务类(Job Class)以及一些参数(JobDataMap)。 4. 定义触发器(Trigger): 触发器可以使用TriggerBuilder来构建。有两种常见的触发器类型: - SimpleTrigger:用于简单的触发规则,例如每隔一定时间执行一次,共执行多少次。 - CronTrigger:使用Cron表达式来定义复杂的调度规则(如每天的某个时间执行)。 5. 启动调度器: 将JobDetail和Trigger绑定到调度器,然后启动调度器。 下面我们分别给出详细的代码示例。 注意:使用前需要添加Quartz依赖(例如Maven): <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.3.2</version> <!-- 版本可根据需要调整 --> </dependency> 示例1:使用原生Quartz API 步骤1:创建任务类 引用[3]中给出了一个简单的任务类。 步骤2-5:调度任务 我们将在一个主方法中完成调度。 示例代码: ```java import org.quartz.*; import org.quartz.impl.StdSchedulerFactory; public class QuartzExample { public static void main(String[] args) throws SchedulerException { // 1. 创建调度器 Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); // 2. 定义任务细节(JobDetail) JobDetail job = JobBuilder.newJob(MyJob.class) .withIdentity("job1", "group1") .build(); // 3. 定义触发器(Trigger) // 例如:立即开始,每10秒执行一次,重复执行 Trigger trigger = TriggerBuilder.newTrigger() .withIdentity("trigger1", "group1") .startNow() .withSchedule(SimpleScheduleBuilder.simpleSchedule() .withIntervalInSeconds(10) .repeatForever()) .build(); // 4. 将任务和触发器注册到调度器 scheduler.scheduleJob(job, trigger); // 5. 启动调度器 scheduler.start(); // 为了演示,让程序运行一段时间(比如1分钟)后关闭 try { Thread.sleep(60000); } catch (InterruptedException e) { e.printStackTrace(); } scheduler.shutdown(); } // 任务类定义 public static class MyJob implements Job { @Override public void execute(JobExecutionContext context) throws JobExecutionException { System.out.println("Executing scheduled task at " + new java.util.Date()); } } } ``` 如果使用CronTrigger,则可以这样定义触发器(例如每天12点执行): ```java Trigger cronTrigger = TriggerBuilder.newTrigger() .withIdentity("trigger2", "group1") .withSchedule(CronScheduleBuilder.cronSchedule("0 0 12 * * ?")) .build(); ``` 关于Spring集成(参考引用[5]): 在Spring中,我们可以通过配置方式声明JobDetail和Trigger,然后将它们注册到Spring管理的Scheduler中。通常需要配置一个SchedulerFactoryBean。 示例Spring配置(XML方式或注解方式): 由于用户没有明确要求,这里不展开,但会简要描述步骤。 使用Spring Boot集成Quartz的步骤: 1. 添加依赖:spring-boot-starter-quartz 2. 定义Job类(同上,但通常需要是无状态的,因为默认每次执行都会创建新的实例) 3. 配置JobDetail和Trigger为Spring Bean(可以通过配置类或属性文件配置) 4. Spring Boot会自动配置Scheduler,并将JobDetail和Trigger注册进去。 此外,Spring还提供了MethodInvokingJobDetailFactoryBean,可以直接调用Spring Bean中的方法作为任务。 最后,我们还需要注意异常处理和任务持久化等高级特性,但基础使用如上述。 总结:我们提供了原生Quartz API的使用步骤和示例代码,并简要提及了Spring集成的方式。 相关问题: 1. 如何配置Quartz的持久化存储? 2.Spring Boot中如何动态管理Quartz定时任务? 3. Quartz的Cron表达式如何编写? 4. 如何处理Quartz任务执行中的异常? 5. Quartz集群如何配置? </think> ### Java Quartz定时任务使用指南 Quartz是一个开源的作业调度框架,用于在Java应用中实现精确的定时任务管理。以下是详细使用步骤: #### 1. **核心组件准备** 需添加Maven依赖: ```xml <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.3.2</version> </dependency> ``` #### 2. **创建任务类** 实现`Job`接口定义任务逻辑(引用[3][^3]): ```java import org.quartz.Job; import org.quartz.JobExecutionContext; public class EmailJob implements Job { @Override public void execute(JobExecutionContext context) { System.out.println("发送定时邮件: " + new Date()); // 实际业务逻辑 } } ``` #### 3. **配置调度器** ```java SchedulerFactory schedulerFactory = new StdSchedulerFactory(); Scheduler scheduler = schedulerFactory.getScheduler(); scheduler.start(); // 启动调度器(引用[4][^4]) ``` #### 4. **定义任务细节(JobDetail)** ```java JobDetail job = JobBuilder.newJob(EmailJob.class) .withIdentity("emailJob", "group1") .usingJobData("recipient", "user@example.com") // 传递参数 .build(); ``` #### 5. **配置触发器(Trigger)** **简单触发器**(固定间隔): ```java Trigger trigger = TriggerBuilder.newTrigger() .withIdentity("trigger1", "group1") .startNow() .withSchedule(SimpleScheduleBuilder .simpleSchedule() .withIntervalInSeconds(30) // 每30秒执行 .repeatForever()) .build(); ``` **Cron触发器**(复杂调度): ```java Trigger cronTrigger = TriggerBuilder.newTrigger() .withIdentity("cronTrigger", "group1") .withSchedule(CronScheduleBuilder .cronSchedule("0 0 9 ? * MON-FRI")) // 工作日9点执行 .build(); ``` #### 6. **注册任务并启动** ```java scheduler.scheduleJob(job, trigger); // 绑定任务与触发器(引用[4][^4]) ``` #### 7. **Spring集成示例(引用[5][^5])** 在Spring配置文件中声明Bean: ```xml <bean id="emailJob" class="com.example.EmailJob"/> <bean id="jobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean"> <property name="jobClass" value="com.example.EmailJob"/> </bean> <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> <property name="jobDetail" ref="jobDetail"/> <property name="cronExpression" value="0 0/5 * * * ?"/> <!-- 每5分钟 --> </bean> <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list><ref bean="cronTrigger"/></list> </property> </bean> ``` #### 关键概念 - **Job**:任务执行逻辑的接口 - **Trigger**:触发任务执行的条件 - **Scheduler**:协调任务调度的核心控制器 - **JobDataMap**:向任务传递参数的容器(引用[1][^1]) #### 使用注意事项 1. 线程安全:确保Job实现类是无状态的 2. 异常处理:在`execute()`方法中捕获所有异常 3. 持久化:可通过`RAMJobStore`(内存)或`JDBCJobStore`(数据库)存储任务
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值