# 定时任务
## 前言
> 定时任务于`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!");
}
}
```
怎么样,应该不是很难吧?
- 前言
- 简单介绍
- 我该如何阅读文档
- 视频教程
- 安装与使用
- 开源协议
- 免责&捐助
- 注意事项
- 版本命名规则简介
- 主要功能版本历史
- 功能指引
- 通用API与功能
- 国际化语言
- 异常
- 消息监听
- @Listen
- @OnListen模板
- @Filter
- 消息参数截取
- @Spare
- @Constr
- @Ignore
- @ListenBreak
- @ListenBreakPlugin
- @ListenBody
- 监听响应
- 成功判定与返回值
- 监听上下文
- 动态参数
- 监听消息API
- 异步监听 @Async
- 限流监听 @Limit
- 自定义Http送信器
- 枚举与类型
- 送信器
- SENDER
- SETTER
- GETTER
- 返回值
- 其他位置
- 日志与日志拦截
- 异常处理
- 依赖注入
- 自定义依赖获取
- 批量依赖载入
- 注意事项
- 常量
- 定时任务
- 自定义过滤
- 拦截器
- 拦截器总定义
- 上下文对象总定义
- 监听消息拦截
- 送信器拦截
- 监听函数拦截
- CAT码
- CQ码
- CQCode
- CQ码工具类
- CQ扩展工具类
- AppendList拼接链
- 高级内容
- 阻断机制
- 截断机制
- 自定义枚举类型
- 枚举工厂
- byName注解
- 自定义注解
- 配置
- 文件配置
- 注解配置
- 参数配置
- 多配置
- 多账号
- 自定义账号管理器
- 小心!
- 核心版本与组件如何升级核心
- 核心版本迭代指南
- 核心
- 更新日志
- jar包与依赖
- 监听消息类结构图
- 快速启动
- 模组与扩展
- 模组开发
- 现有模组
- 通用模组-延时任务
- 通用模组-CQ码工具
- 转义器
- CQ码操作工具类
- CQ码模板-CodeTemplate
- CQ码载体-KQCode
- CQ码构建器
- MQ码工具类
- 通用模组-redis-bot管理器
- 通用模组-Debugger
- Debugger-common模块
- Debugger-server模块
- Debugger-client模块
- 通用模组-钉钉机器人
- 组件-Mirai(JVM)
- 快速开始(1.13+)
- springboot-starter
- 注意事项
- 配置
- 额外的内容
- 快速回复
- 额外监听
- CQ码解析
- 组件-酷Q(QQ)-CQ HTTP API(基本失效)
- 快速开始(推荐)
- 快速开始(1.7.x以下,不推荐)
- 快速开始(Springboot启动器)
- 启动器、启动接口与配置类
- 配置
- 文件配置
- 注意事项
- 更新日志
- 额外的内容
- 自定义额外监听
- CQ送信器
- 元事件
- 监听消息类结构图
- 组件-酷Q(QQ)-JCQ(失效)
- 快速开始
- 更新日志
- 额外的内容
- JCQ日志
- 配置
- 注意事项
- 监听消息类结构图
- 组件-酷Q(QQ)-HTTP TO CQ(失效)
- 快速开始(核心1.7.x及以下)
- 启动器、启动接口与配置类
- 配置
- 文件配置
- 注意事项
- 更新日志
- 监听消息类结构图
- 组件-酷Q(QQ)-LEMOC (失效)
- 快速开始(核心1.7.x及以下)
- 配置
- 注意事项
- 更新日志
- 监听消息类结构图
- Springboot快速启动器
- 常见问题汇总
- BUG反馈
- 更新计划总览