# 定时任务
[TOC=2,3]
项目在线上运行时,经常要定时去执行某个功能,这时候就需要使用定时任务来处理了。ThinkJS 支持命令行方式调用,结合系统的 crontab 功能可以很好的支持定时任务。
## 命令行执行
ThinkJS 除了支持通过 URL 访问来执行外,还可以通过命令行的方式调用执行。使用方式如下:
~~~
node www/production.js home/index/index
~~~
上面的命令表示执行 `home` 模块下 `index` Controller 里的 indexAction。
#### 携带参数
如果需要加参数,只要在后面加上对应的参数即可:
~~~
node www/production.js home/index/index?name=thinkjs
~~~
Action 里就可以通过 `this.get` 方法来获取参数 `name` 了。
#### 修改请求方法
命令行执行默认的请求类型是 GET,如果想改为其他的类型,可以用下面的方法:
~~~
node www/production.js url=home/index/index&method=post
~~~
这样就把请求类型改为了 post。但这种方式下,参数 url 的值里就不能包含 & 字符了(可以通过上面 / 的方式指定参数)。
除了修改请求类型,还可以修改下面的参数:
* `host` 修改请求的 host 默认为 127.0.0.1
* `ip` 修改请求的 ip 默认为 127.0.0.1
#### 修改 header
有时候如果想修改更多的 headers,可以传一个完整的 json 数据,如:
~~~
node www/production.js {"url":"/index/index","ip":"127.0.0.1","method":"POST","headers":{"xxx":"yyyy"}}
~~~
#### 禁止 URL 访问
默认情况下,命令行执行的 Action 通过 URL 也可以访问到。如果禁止 URL 访问到该 Action,可以通过`think.cli` 来判断。如:
~~~
export default class extends think.controller.base {
indexAction(){
//禁止 URL 访问该 Action
if(!think.cli){
this.fail("only invoked in cli mode");
}
...
}
}
~~~
## 执行脚本
可以创建一个简单的执行脚本来调用命令行执行,如:
~~~
cd project_path;
node www/prodution.js home/index/index;
~~~
在项目目录下创建目录 `crontab`,将上面执行脚本存为一个文件放在该目录下。
## 定时执行
借助系统里的 crontab 可以做到定时执行,通过命令 `crontab -e` 来编辑定时任务,如:
~~~
0 */1 * * * /bin/sh project_path/crontab/a.sh # 1 小时执行一次
~~~
## 使用 node-crontab 模块执行定时任务
除了使用 crontab 和命令行联合执行定时任务外,也可以使用 `node-crontab` 模块执行定时任务。如:
~~~
import crontab from "node-crontab";
// 1 小时执行一次
let jobId = crontab.scheduleJob("0 */1 * * *", () => {
});
~~~
将上面代码文件存放在 `src/common/bootstrap` 目录下,这样可以在服务启动时自动执行。
- 快速入门
- 介绍
- 创建项目
- 项目结构
- 代码规范
- 升级指南
- 进阶应用
- 模块
- 控制器
- 视图
- 配置
- 路由
- 模型
- 介绍
- 事务
- 关联模型
- Mysql
- MongoDB
- SQLite
- Adapter
- 介绍
- Cache
- Session
- WebSocket
- Template
- 扩展功能
- thinkjs 命令
- 静态资源访问
- Middleware
- Service
- Cookie
- 错误处理
- 错误信息
- 数据校验
- 国际化
- 路径常量
- REST API
- 定时任务
- 线上部署
- 推荐模块
- API
- think
- think.base
- think.http.base
- http
- controller
- rest controller
- model
- model.mongo
- middleware