Quartz---入门级实例

本文详细介绍了如何使用Quartz框架实现定时功能,包括创建Job、触发器、配置及在Web应用中的使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用 Quartz 实现定时功能,  Quartz 是一个完全由 java 编写的开源作业调度框架。

Quartz的几个核心的接口和类为:     

Job 接口: 自己写的 “ 定时程序 ” 实现此接口的 void execute(JobExecutionContext arg0) 方法 ,Job 还有一类为有状态的 StatefulJob 接口,如果我们需要在上一个作业执行完后,根据其执行结果再进行下次作业的执行,则需要实现此接口。  

Trigger 抽象类: 调度类 (Scheduler) 在时间到时调用此类,再由 trigger 类调用指定的定时程序。  

Quertz 中提供了两类触发器为: SimpleTrigger,CronTrigger 。前者用于实现比较简单的定时功能,例如几点开始,几点结束,隔多长时间执 行,共执行多少次等,后者提供了使用表达式来描述定时功能,因此适用于比较复杂的定时描述,例如每个月的最后一个周五,每周的周四等。  

JobDetail 类: 具体某个定时程序的详细描述,包括 Name,Group,JobDataMap 等。  

J obExecutionContext 类: 定时程序执行的 run-time 的上下文环境,用于得到当前执行的 Job 的名字,配置的参数等。  

JobDataMap 类: 用于描述一个作业的参数,参数可以为任何基本类型例如 String,float 等,也可为某个对象的引用 .  

JobListener,TriggerListener 接口: 用于监听触发器状态和作业扫行状态,在特写状态执行相应操作。  

JobStore 类: 在哪里执行定进程序,可选的有在内存中,在数据库中。

 

#创建一个 Job : 

当 Quartz   调度器确定到时间要激发一个   Job   的时候,它就会生成一个  Job   实例,并调用这个实例的  execute()   方法。可以在  execute()   方法中执行你的业务逻辑。

Java代码  收藏代码
  1. public class TestJob implements Job{  
  2.       
  3.     public TestJob(){}  
  4.     /** 
  5.      * Test Job == Print Job Name + Execute Time 
  6.      * @param context 
  7.      * @throws JobExecutionException 
  8.      */  
  9.     public void execute(JobExecutionContext context)throws JobExecutionException{  
  10.         String name = context.getJobDetail().getJobDataMap().getString("name");    
  11.         System.out.println("job executing..."+ name + "********Date : " + new Date());   
  12.     }  
  13. }  

#  创建并运行  Quartz Scheduler

当调度器起来之后,你可以利用它做很多事情或者获取到它的许多信息。例如,你也许需要安排一些  Job    或者改变又安排在调度器上   Job   的执行次数。你也许需要让调度器处于暂停模式,接着再次启动它以便重新执行在其上安排的作业。当调度器处于暂停模式时,不执行任何作业,即使是作业到了它所期待的执行时间。

Java代码  收藏代码
  1. public class QuartzTest {  
  2.     /** 
  3.      * Test Job : main method  
  4.      */  
  5.     public static void main(String[] args) {  
  6.         QuartzTest test = new QuartzTest();  
  7.         try{  
  8.             test.startSchedule();  
  9.         }catch(Exception e){  
  10.             e.printStackTrace();  
  11.         }  
  12.     }  
  13.       
  14.     public void startSchedule()throws Exception{  
  15.         Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();  
  16.         JobDetail jobDetail = new JobDetail("testJob", Scheduler.DEFAULT_GROUP, TestJob.class);  
  17.         jobDetail.getJobDataMap().put("name","testJob");    
  18.         //结束时间         
  19.         long end = System.currentTimeMillis() + 9000L;    
  20.         //执行10次,每3秒执行一次,到9秒后结束    
  21.         SimpleTrigger trigger = new SimpleTrigger("test",null,new Date(),new Date(end),10,3000L);    
  22.         scheduler.scheduleJob(jobDetail, trigger);    
  23.         scheduler.start();    
  24.     }     
  25. }  
 

执行上面这个类基本实现了一个简单的定时程序。但问题是现在这个类只能应用在application 中,在 web 环境里执行还需要添加一些配置。

************************************** web 应用中使用 ***********************************

在web.xml 中添加  QuartzInitializerServlet , Quartz 为能够在 web 应用中使用,提供了一个 QuartzInitializerServlet 和一个 QuartzInitializerListener ,用于在加载 web 应用时,对 quartz  进行初始化。

Java代码  收藏代码
  1. <servlet>     
  2.         <servlet-name>QuartzInitializer</servlet-name>     
  3.         <servlet-class>org.quartz.ee.servlet.QuartzInitializerServlet</servlet-class>     
  4.         <init-param>    
  5.             <param-name>shutdown-on-unload</param-name>    
  6.             <param-value>true</param-value>    
  7.         </init-param>    
  8.         <init-param>    
  9.             <param-name>config-file</param-name>    
  10.             <param-value>quartz.properties</param-value>     
  11.         </init-param>    
  12.         <load-on-startup>2</load-on-startup>    
  13. </servlet>    

上面提到了quartz.properties, 这是自行指定的, Quartz 提供了一个默认的配置文件,可以满足基本的 j2se 应用,如果 在 web 应用中,我们想把 job,trigger 配置都写到文件中,就需要自己来写,并指定在初始化时加载我们自己的  quratz.properties ,位置放在 classes 下。  

Xml代码  收藏代码
  1. #============================================================================    
  2. # Configure Main Scheduler Properties      
  3. #============================================================================    
  4. org.quartz.scheduler.instanceId = AUTO    
  5. #============================================================================    
  6. # Configure ThreadPool      
  7. #============================================================================    
  8. orgorg.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool    
  9. org.quartz.threadPool.threadCount = 3    
  10. org.quartz.threadPool.threadPriority = 5    
  11. #============================================================================    
  12. # Configure Plugins     
  13. #============================================================================    
  14. orgorg.quartz.plugin.triggHistory.class = org.quartz.plugins.history.LoggingJobHistoryPlugin    
  15. orgorg.quartz.plugin.jobInitializer.class = org.quartz.plugins.xml.JobInitializationPlugin    
  16. org.quartz.plugin.jobInitializer.fileName = /scheduler/quartz_jobs.xml    
  17. org.quartz.plugin.jobInitializer.overWriteExistingJobs = true    
  18. org.quartz.plugin.jobInitializer.failOnFileNotFound = true    
  19. org.quartz.plugin.jobInitializer.scanInterval = 10    
 quartz要使用插件来加载自己的 xml 配置文件,上边我们指定了在初始化时加载classes\scheduler\quartz_jobs.xml ,默认的是加载 classes\quartz_jobs.xml 文件。
Xml代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <quartz>    
  3.     <job>    
  4.         <job-detail>    
  5.             <name>test</name>    
  6.             <group>DEFAULT</group>    
  7.             <description>testJobhere</description>    
  8.             <job-class>vivi.test.quartz.TestJob</job-class>    
  9.             <job-data-map allows-transient-data="true">    
  10.                 <entry>    
  11.                     <key>name</key>    
  12.                     <value>test</value>    
  13.                 </entry>    
  14.             </job-data-map>    
  15.         </job-detail>    
  16.         <trigger>    
  17.             <cron>    
  18.                 <name>testCron</name>    
  19.                 <group>DEFAULT</group>    
  20.                 <job-name>test</job-name>    
  21.                 <job-group>DEFALUT</job-group>    
  22.                 <cron-expression>0/3 * * * * ?</cron-expression>    
  23.             </cron>    
  24.         </trigger>    
  25.     </job>    
  26. </quartz>    
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值