Quartz2.1.5学习(二)

简介:

 到下班时间了,赶快把这篇博文写完。今天终于把项目中用到Quartz部分的功能写完了。好了,废话不多说了,继续上次的学习记录。我们来看第二个例子,这个例子中主要讲到的是使用SimpleTrigger这个对象,这个对象可以在未来某一个时刻定时执行一项任务,可以执行多个任务,可以重复这些任务和次数与间隔(时间、次数)。


项目界面:

首先,我们当然需要看下我们执行任务的类,直接上代码:

SimpleJob.java


 
 
  1. package main.java.org.quartz.examples.example2; 
  2.  
  3. import java.text.SimpleDateFormat; 
  4. import java.util.Date; 
  5.  
  6. import org.slf4j.Logger; 
  7. import org.slf4j.LoggerFactory; 
  8. import org.quartz.Job; 
  9. import org.quartz.JobExecutionContext; 
  10. import org.quartz.JobExecutionException; 
  11. import org.quartz.JobKey; 
  12.  
  13.  
  14. public class SimpleJob implements Job { 
  15.  
  16.     private static Logger _log = LoggerFactory.getLogger(SimpleJob.class); 
  17.  
  18.     public SimpleJob() {} 
  19.  
  20.  
  21.     public void execute(JobExecutionContext context) 
  22.         throws JobExecutionException { 
  23.  
  24.         JobKey jobKey = context.getJobDetail().getKey(); 
  25.         SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
  26.         //这里的jobkey,API里是这样说的: 
  27.         //它标识一个唯一的jobDetail 
  28.         //key是由组名称和job名称组成,job名称必须是惟一的。 
  29.         //如果只有一个组名称,那么它的组名称默认就被指定为这个组名称。 
  30.         //意思就是job的组名称和job名称 
  31.         _log.info("jobKey: " + jobKey + "执行时间:" + sdf.format(new Date())); 
  32.     } 
  33.  

下面是我们的任务调度程序(记得上节讲的那几个步骤,创建调度就不成问题)

 

SimpleTriggerExample.java

 


 
 
  1. package main.java.org.quartz.examples.example2; 
  2.  
  3. import static org.quartz.JobBuilder.newJob; 
  4. import static org.quartz.TriggerBuilder.newTrigger; 
  5.  
  6. import java.util.Date; 
  7.  
  8. import org.quartz.DateBuilder; 
  9. import org.quartz.JobDetail; 
  10. import org.quartz.Scheduler; 
  11. import org.quartz.SchedulerFactory; 
  12. import org.quartz.SchedulerMetaData; 
  13. import org.quartz.SimpleTrigger; 
  14. import org.quartz.impl.StdSchedulerFactory; 
  15. import org.slf4j.Logger; 
  16. import org.slf4j.LoggerFactory; 
  17.  
  18. public class SimpleTriggerExample { 
  19.  
  20.      
  21.     public void run() throws Exception { 
  22.         Logger log = LoggerFactory.getLogger(SimpleTriggerExample.class); 
  23.  
  24.         log.info("------- Initializing -------------------"); 
  25.         SchedulerFactory sf = new StdSchedulerFactory(); 
  26.         Scheduler sched = sf.getScheduler(); 
  27.         log.info("------- Initialization Complete --------"); 
  28.  
  29.         log.info("------- Scheduling Jobs ----------------"); 
  30.         //当前时间加15秒 
  31.         Date startTime = DateBuilder.nextGivenSecondDate(null15); 
  32.         JobDetail job = newJob(SimpleJob.class
  33.             .withIdentity("job1""group1"
  34.             .build(); 
  35.          
  36.         SimpleTrigger trigger = (SimpleTrigger) newTrigger()  
  37.             .withIdentity("trigger1""group1"
  38.             .startAt(startTime) 
  39.             .build(); 
  40.  
  41.         Date ft = sched.scheduleJob(job, trigger); 
  42.         sched.addJob(job, true); 
  43.         log.info(job.getKey() + 
  44.                 " will run at: " + ft +   
  45.                 " and repeat: " + trigger.getRepeatCount() +  
  46.                 " times, every " + trigger.getRepeatInterval() / 1000 + " seconds"); 
  47.          
  48.         log.info("------- 开始 Scheduling Jobs... --------------"); 
  49.         log.info("------- 等待 30 秒... --------------"); 
  50.         sched.start(); 
  51.         try { 
  52.             Thread.sleep(30 * 1000);  
  53.         } catch (Exception e) { 
  54.         } 
  55.         
  56.         log.info("------- 关闭 ---------------------"); 
  57.         sched.shutdown(true); 
  58.         log.info("------- 关闭完成 -----------------"); 
  59.         SchedulerMetaData metaData = sched.getMetaData(); 
  60.         log.info("执行了 " + metaData.getNumberOfJobsExecuted() + " 个工作。"); 
  61.     } 
  62.  
  63.     public static void main(String[] args) throws Exception { 
  64.  
  65.         SimpleTriggerExample example = new SimpleTriggerExample(); 
  66.         example.run(); 
  67.  
  68.     } 
  69.  

这里我只执行了一次任务调度,如果想要执行多个任务只需要newJob、newTrigger,之后sched.addJob(job, true);将其加进任务调度队列里面就可以了。

 


 
 
  1. SimpleTrigger trigger = newTrigger() 
  2.             .withIdentity("trigger7""group1"
  3.             .startAt(startTime) 
  4.             .withSchedule(simpleSchedule() 
  5.                     .withIntervalInMinutes(5
  6.                     .withRepeatCount(20)) 
  7.             .build(); 

这里可以设置它的循环次数和间隔时间。(这里指的意思是每隔5分钟执行一次任务,共执行20次)

withIntervalInminutes()这个方法是在org.quartz.SimpleScheduleBuilder包下的,里面包含了很多方法(它们都返回 SimpleScheduleBuilder

withIntervalInHours(int intervalInHours) 指定一个重复间隔以小时为单位。

withIntervalInMilliseconds(long intervalInMillis) 指定一个重复间隔以毫秒为单位。

withIntervalInMinutes(int intervalInMinutes) 指定一个重复间隔以分钟为单位。

withIntervalInSeconds(int intervalInSeconds) 指定一个重复间隔以秒为单位。

……

withRepeatCount(int number):这个一看就明白,是执行多少次的意思。

startAt(Date startTime):定时开始执行的时间

endAt(Date triggerEndTime):定时结束执行的时间

具体可以到DOC文件夹下看API。。。。这里不多说了。。。

 

好吧,来看下执行后控制台打印的信息:

 


 
 
  1. [INFO] 12 六月 07:15:30.812 下午 main [main.java.org.quartz.examples.example2.SimpleTriggerExample] 
  2. ------- Initializing ------------------- 
  3.  
  4. [INFO] 12 六月 07:15:30.859 下午 main [org.quartz.impl.StdSchedulerFactory] 
  5. Using default implementation for ThreadExecutor 
  6.  
  7. [INFO] 12 六月 07:15:30.859 下午 main [org.quartz.simpl.SimpleThreadPool] 
  8. Job execution threads will use class loader of thread: main 
  9.  
  10. [INFO] 12 六月 07:15:30.890 下午 main [org.quartz.core.SchedulerSignalerImpl] 
  11. Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl 
  12.  
  13. [INFO] 12 六月 07:15:30.890 下午 main [org.quartz.core.QuartzScheduler] 
  14. Quartz Scheduler v.2.1.5 created. 
  15.  
  16. [INFO] 12 六月 07:15:30.890 下午 main [org.quartz.simpl.RAMJobStore] 
  17. RAMJobStore initialized. 
  18.  
  19. [INFO] 12 六月 07:15:30.890 下午 main [org.quartz.core.QuartzScheduler] 
  20. Scheduler meta-data: Quartz Scheduler (v2.1.5) 'DefaultQuartzScheduler' with instanceId 'NON_CLUSTERED' 
  21.   Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally. 
  22.   NOT STARTED. 
  23.   Currently in standby mode. 
  24.   Number of jobs executed: 0 
  25.   Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads. 
  26.   Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered. 
  27.  
  28.  
  29. [INFO] 12 六月 07:15:30.890 下午 main [org.quartz.impl.StdSchedulerFactory] 
  30. Quartz scheduler 'DefaultQuartzScheduler' initialized from default resource file in Quartz package: 'quartz.properties' 
  31.  
  32. [INFO] 12 六月 07:15:30.890 下午 main [org.quartz.impl.StdSchedulerFactory] 
  33. Quartz scheduler version: 2.1.5 
  34.  
  35. [INFO] 12 六月 07:15:30.890 下午 main [main.java.org.quartz.examples.example2.SimpleTriggerExample] 
  36. ------- Initialization Complete -------- 
  37.  
  38. [INFO] 12 六月 07:15:30.890 下午 main [main.java.org.quartz.examples.example2.SimpleTriggerExample] 
  39. ------- Scheduling Jobs ---------------- 
  40.  
  41. [INFO] 12 六月 07:15:30.921 下午 main [main.java.org.quartz.examples.example2.SimpleTriggerExample] 
  42. group1.job1 will run at: Tue Jun 12 19:15:45 CST 2012 and repeat: 0 times, every 0 seconds 
  43.  
  44. [INFO] 12 六月 07:15:30.921 下午 main [main.java.org.quartz.examples.example2.SimpleTriggerExample] 
  45. ------- 开始 Scheduling Jobs... -------------- 
  46.  
  47. [INFO] 12 六月 07:15:30.921 下午 main [main.java.org.quartz.examples.example2.SimpleTriggerExample] 
  48. ------- 等待 30 秒... -------------- 
  49.  
  50. [INFO] 12 六月 07:15:30.921 下午 main [org.quartz.core.QuartzScheduler] 
  51. Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED started. 
  52.  
  53. [INFO] 12 六月 07:15:45.000 下午 DefaultQuartzScheduler_Worker-1 [main.java.org.quartz.examples.example2.SimpleJob] 
  54. jobKey: group1.job1执行时间:2012-06-12 19:15:45 
  55.  
  56. [INFO] 12 六月 07:16:00.921 下午 main [main.java.org.quartz.examples.example2.SimpleTriggerExample] 
  57. ------- 关闭 --------------------- 
  58.  
  59. [INFO] 12 六月 07:16:00.921 下午 main [org.quartz.core.QuartzScheduler] 
  60. Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED shutting down. 
  61.  
  62. [INFO] 12 六月 07:16:00.921 下午 main [org.quartz.core.QuartzScheduler] 
  63. Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED paused. 
  64.  
  65. [INFO] 12 六月 07:16:01.406 下午 main [org.quartz.core.QuartzScheduler] 
  66. Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED shutdown complete. 
  67.  
  68. [INFO] 12 六月 07:16:01.406 下午 main [main.java.org.quartz.examples.example2.SimpleTriggerExample] 
  69. ------- 关闭完成 ----------------- 
  70.  
  71. [INFO] 12 六月 07:16:01.406 下午 main [main.java.org.quartz.examples.example2.SimpleTriggerExample] 
  72. 执行了 1 个工作。 

饿死了,赶快回家吃饭。下节继续。

 

=======================================================================

以上属于个人观点,难免有错误,如发现错误请留言告之,我会订正的。

=======================================================================

 


本文转自shyy8712872 51CTO博客,原文链接:http://blog.51cto.com/shuyangyang/896615,如需转载请自行联系原作者


相关文章
|
Ubuntu 关系型数据库 MySQL
如何在 Ubuntu 20.04 上安装 MySQL
MySQL是最流行的开源关系数据库管理系统。它速度快,容易使用,容易扩展,并且流行的LAMP和LEMP的一部分。 这篇指南讲解了如何在 Ubuntu 20.04上安装和保护 MySQL。 一、前提条件 确保你以 sudo 用户身份登录 二、在 Ubuntu 上安装 MySQL 在写作这篇文章的时候,Ubuntu 源仓库中最新的 MySQL 版本号是 MySQL 8.0。
58033 4
如何在 Ubuntu 20.04 上安装 MySQL
|
Java Maven
Maven - Error:java: Annotation processing is not supported for module cycles. Please ensure that all
Maven - Error:java: Annotation processing is not supported for module cycles. Please ensure that all
2243 0
Maven - Error:java: Annotation processing is not supported for module cycles. Please ensure that all
|
5月前
|
存储 人工智能 前端开发
AI数字人口播直播模式系统开发布局逻辑
AI数字人口播直播系统结合先进AI技术,实现数字人自动化直播,适用于品牌推广与内容创作。系统涵盖形象设计、技术架构、直播流程优化及合规性布局,为新媒体提供高效、智能的直播解决方案。
|
3月前
|
存储 SQL NoSQL
Redis-常用语法以及java互联实践案例
本文详细介绍了Redis的数据结构、常用命令及其Java客户端的使用,涵盖String、Hash、List、Set、SortedSet等数据类型及操作,同时提供了Jedis和Spring Boot Data Redis的实战示例,帮助开发者快速掌握Redis在实际项目中的应用。
292 1
Redis-常用语法以及java互联实践案例
|
10月前
|
人工智能 自然语言处理 搜索推荐
【上篇】-分两篇步骤介绍-如何用topview生成和自定义数字人-关于AI的使用和应用-如何生成数字人-优雅草卓伊凡-如何生成AI数字人
【上篇】-分两篇步骤介绍-如何用topview生成和自定义数字人-关于AI的使用和应用-如何生成数字人-优雅草卓伊凡-如何生成AI数字人
479 24
【上篇】-分两篇步骤介绍-如何用topview生成和自定义数字人-关于AI的使用和应用-如何生成数字人-优雅草卓伊凡-如何生成AI数字人
|
10月前
|
存储 小程序 前端开发
微信小程序与Java后端实现微信授权登录功能
微信小程序极大地简化了登录注册流程。对于用户而言,仅仅需要点击授权按钮,便能够完成登录操作,无需经历繁琐的注册步骤以及输入账号密码等一系列复杂操作,这种便捷的登录方式极大地提升了用户的使用体验
2967 12
|
关系型数据库 MySQL
MySQL查看连接数和进程信息
这篇文章介绍了如何在MySQL中查看连接数和进程信息,包括当前打开的连接数量、历史成功建立连接的次数、连接错误次数、连接超时设置,以及如何查看和终止正在执行的连接进程。
1684 10
|
SQL 关系型数据库 数据库
实时计算 Flink版操作报错之使用SQL 将 PostgreSQL 的 date 类型字段转换为 TIMESTAMP 类型时遇到报错,该如何处理
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
网络协议 Linux
云服务器内部端口占用,9090端口已经存在了,如何关闭,Linux查询端口,查看端口,端口查询,关闭端口写法-netstat -tuln,​fuser -k 3306/tcp​
云服务器内部端口占用,9090端口已经存在了,如何关闭,Linux查询端口,查看端口,端口查询,关闭端口写法-netstat -tuln,​fuser -k 3306/tcp​
|
消息中间件 编解码 网络协议
Netty从入门到精通:高性能网络编程的进阶之路
【11月更文挑战第17天】Netty是一个基于Java NIO(Non-blocking I/O)的高性能、异步事件驱动的网络应用框架。使用Netty,开发者可以快速、高效地开发可扩展的网络服务器和客户端程序。本文将带您从Netty的背景、业务场景、功能点、解决问题的关键、底层原理实现,到编写一个详细的Java示例,全面了解Netty,帮助您从入门到精通。
1537 0