Heroku Scheduler でnode.jsを動かす
目的
Heroku schedulerでnode.jsの定時実行を行いたい
前提
- 動作確認環境
- Windows10, VSCode
- Node v8.11.3 (local)
- Heroku
- 参考
- http://www.modeo.co/blog/2015/1/8/heroku-scheduler-with-nodejs-tutorial
- https://devcenter.heroku.com/articles/scheduler
Heroku Projectの作成、設定
Heroku Projectの作成、設定
node.jsプロジェクトフォルダで heroku create
> heroku create n2-sample-scheduler
Heroku sckedulerのインストール
> heroku addons:create scheduler:standard
package.jsonの作成
> npm init
ジョブ用ソース作成
hello.js
hello.js
# !/usr/bin/env node
function sayHello() {
console.log('Hello hello.js');
}
sayHello();
npmコマンドの追加
package.json
package.json
"scripts": {
+ "job-hello":"node hello.js",
Localで動作テスト
herolo localコマンドでテスト
> heroku local:run npm run job-hello
Deploy to Heroku
Herokuへアップロード
> git add .
> git commit -m "add job-hello"
> git push heroku master
動作確認( Heroku remote)
> heroku run npm run job-hello
ログ確認
> heroku logs
Heroku Schedulerの設定
Heroku Schedulerの設定
> heroku addons:open scheduler
- [Add new Job] > "npm run job-hello"を設定
- FREQENCY = Every 10 minutes
- [Save]
10分後に実行されているかログを確認する
> heroku logs
その他(随時追記)
[mongoose] scheduleがスキップされることがある
-
原因
mongooseの接続が残っっていてプロセスが次のスケジュールまでに終わらない。 -
対策
Job終了時に接続を閉じること
var mongoose = require("mongoose")
// いろいろ処理される
//最後に切断
mongoose.disconnect()
workerとcronを使ってもっと柔軟に実行したい
下記参考
worker Dynoを利用してNode.jsバッチを実装する
- procfile にworkerを定義
- cron パッケージを利用する
Procfile
worker: node worker.js
worker.js
var CronJob = require('cron').CronJob;
var workerJob = new CronJob({
cronTime: '*/10 * * * * *', //毎10秒実行
onTick: function() {
//ここに実行したい処理を書く
console.log('Hoge !');
},
start: true, //newした後即時実行するかどうか
timeZone: 'Asia/Tokyo'
});
workerJob.start();
デプロイ後 workerを有効にする
heroku scale worker=1
ログ確認
heroku logs
2018-12-13T16:20:30.016441+00:00 app[worker.1]: Hoge !
2018-12-13T16:20:40.008675+00:00 app[worker.1]: Hoge !
2018-12-13T16:20:50.010855+00:00 app[worker.1]: Hoge !
2018-12-13T16:21:10.008725+00:00 app[worker.1]: Hoge !