Edited at

AdonisJs で adonis-scheduler を使って cron を設定する

More than 1 year has passed since last update.


概要

表題の通り、AdonisJs で adonis-scheduler を使って cron を設定して、タスクを自動で実行する。

AdonisJs のバージョンは 4.1 を使う。


初期設定

adonis-scheduler をインストールする。

$ npm install --save adonis-scheduler

start/app.js で各種設定をする。


start/app.js

const providers = [

...
'adonis-scheduler/providers/SchedulerProvider'
]

const aliases = {
...
Scheduler: 'Adonis/Addons/Scheduler'
}

const aceProviders = [
...
'adonis-scheduler/providers/CommandsProvider'
]



タスクをつくる

まずは、実行するタスクをつくる。

ここでは、試しに Example というタスクをつくって、実行してみる。

$ adonis make:task Example

もしくは

$ node ace make:task Example

を叩くと、app/TasksExample.js というファイルが生成される。


app/Tasks/Example.js

'use strict'

const Task = use('Task')

class Example extends Task {
static get schedule () {
return '0 */1 * * * *'
}

async handle () {
this.info('Task Example handle')
}
}

module.exports = Example


あとは、schedule に実行条件、handle に実行内容を書けば良い。

実行条件は、node-schedule と同じ記法で書くことができる。


実行する

ここまでできれば、あとは実行すれば良いだけである。

$ adonis run:scheduler

もしくは

$ node ace run:scheduler

で起動するので、package.jsonscripts を以下のように変えてあげると良い。


package.json

{

...
"scripts": {
"start": "node server.js & node ace run:scheduler"
}
}

実行して、ターミナルにこのようなログが流れればオッケー!(試しにやるときは、実行条件を毎秒とかにすると良い)

2018-04-04T05:39:40.007Z - info: { task: 'example' } 'Task Example handle'


おまけ

個人的に package.jsonscripts をゴチャゴチャさせたくないし、普通にサーバーが立ち上がるときに scheduler も立ち上がってくれていいよとなった。

そのような場合は、以下のようなファイルをつくって


start/schedule.js

'use strict'

const Scheduler = use('Scheduler')
Scheduler.run()


server.js で呼び出すとうまく動く。


server.js

'use strict'

const { Ignitor } = require('@adonisjs/ignitor')

new Ignitor(require('@adonisjs/fold'))
.appRoot(__dirname)
.preLoad('start/scheduler') // ここを足した
.fireHttpServer()
.catch(console.error)