# 定时任务 ## 前言 > 定时任务于`0.9-BETA`版本开始引入核心框架。考虑到效率和完善度(借口),我并没有自己再造一个定时任务的轮子,而是直接使用了定时任务框架`quartz-2.3.0`。 > `quartz`框架官方网站:[Quartz Enterprise Job Scheduler](http://www.quartz-scheduler.org/) > 首先声明,我本人并不是十分熟悉`quartz`框架,如果我犯了什么技术性错误或者有什么遗漏,还请告知、谅解。 ## 使用方式 > 实现 **TimeJob** 接口 ### 第一步 首先,由于使用了`quartz`框架,所以当你想要创建一个定时任务的时候,首先需要使你的任务实现`org.quartz.Job`接口,并实现其中的`execute`方法。 ```Java void execute(JobExecutionContext var1) throws JobExecutionException; ``` 但是再进行整合的过程中, 我发现如果这样的话,不便于使用者获取我想要给你的参数,例如`MsgSender`。于是,我便提供了一个很简单的封装接口:`com.forte.qqrobot.timetask.TimeJob` 接口。此接口重写了原来的`execute`方法并提供了一个新的`execute`方法: ```Java void execute(MsgSender msgSender, CQCodeUtil cqCodeUtil); ``` 于是你只需要实现这个接口,就可以很简单的使用`MsgSender`和`CQCodeUtil`类的实例对象了。 <br> > 假如你在正确实现了此接口后,出现了无法编译的情况,例如IDEA会提示`xxxxx不是抽象的,并且未覆盖org.quartz.Job中的抽象方法execute(org.quartz.JobExecutionContext)` > 此时,首先检查IDEA的项目配置中的`Project`、`Modules`等标签中的JDK等级均至少为Java8 > 其次如果依旧不行,且此项目为Maven项目,则在`pom.xml`配置文件中的`build`标签中添加如下插件: ```xml <build> ... <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.6.1</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> ... </build> ``` <br> <br> 参数的传递原理是使用了`quartz`框架中的`JobDataMap`类进行参数传递的,如果你熟悉`quartz`,知道其他更加便捷的使用方式,那么太好了,请尽情发挥。如果你不熟悉此框架,没关系,你可以使用我提供的`TimeJob`接口。 ### 使用注解吧! 我为定时任务提供了三种注解: ```Java @CronTask @FixedRateTask @TypeTask ``` 通过这三种注解,我主要使用了`quartz`的两大最常用的定时任务方式:重复触发和cron表达式 > 这三种注解均可以重复使用,但是你要注意:你每使用一个注解,就相当于创建了一个定时任务 #### @CronTask `@CronTask`注解为使用cron表达式作为触发器来执行定时任务的。 > 如果不熟悉cron是什么,可以去百度查查,或者看看之后两个注解 此注解有2个参数: | 参数 | 类型 | 含义 | 默认值(没有则为必填) | | --- | --- | --- | --- | | `id` | `String` | 标记的定时任务的id,如果为空则默认为类名, 用于创建触发器与任务实例 | 默认为类名 | | `value` | `String` | cron表达式 | | #### @FixedRateTask `@FixedRateTask`注解为某段时间重复触发作为触发器来执行定时任务的。 > 例如:2秒执行一次、5分钟执行一次之类这样的 此注解有4个参数: | 参数 | 类型 | 含义 | 默认值(没有则为必填) | | --- | --- | --- | --- | | `id` | `String` | 标记的定时任务的id,如果为空则默认为类名, 用于创建触发器与任务实例 | 默认为类名 | | `value` | `long` | 时间间隔的内容:毫秒、秒、分等等,类型由参数 `timeType` 决定 | | | `timeType` | `TimeType` | 时间类型,详细内容请查阅`枚举`章节 | 默认为秒类型 | | `RepeatCount` | `int` | 开始后的重复次数,-1为无限重复 | -1,即无限重复 | #### @TypeTask `@TypeTask`准确来讲,是前两个注解的懒人包。他在里面提供了一系列的模板,让使用者不再头疼于一些简单的时间间隔(真的只是一些简单的,复杂的还是得自己写的=w=) 此注解有2个参数: | 参数 | 类型 | 含义 | 默认值(没有则为必填) | | --- | --- | --- | --- | | `id` | `String` | 标记的定时任务的id,如果为空则默认为类名, 用于创建触发器与任务实例 | 默认为类名 | | `value` | `TimeTaskTemplate` | 定时任务模板, 详细内容请参阅`枚举`章节 | | #### 最后 知道了接口,也熟悉了注解,那么怎么使用呢?还用问吗,就那么用呗。 举例: ```java @CronTask("0/5 * * * * ? *") public class MyJob implements TimeJob { /** 这是一个每5秒给qq:1234567890发送一句 'hi!'的定时任务*/ @Override public void execute(MsgSender msgSender, CQCodeUtil cqCodeUtil) { msgSender.SENDER.sendPrivateMsg("1234567890", "hi!"); } } ``` 怎么样,应该不是很难吧?