【发布时间】:2017-05-17 21:56:03
【问题描述】:
我在 node.js 中使用 cron 来安排一个在用户确定的时间发送文本消息的函数。它可以在我的本地服务器上运行,但是当我部署到 heroku 时,这些函数永远不会被调用。
【问题讨论】:
-
请贴出我们需要的相关代码sn-ps,以帮助您诊断和解决问题。此外,您应该阅读这个简短的 SO 帮助页面:MCVE
我在 node.js 中使用 cron 来安排一个在用户确定的时间发送文本消息的函数。它可以在我的本地服务器上运行,但是当我部署到 heroku 时,这些函数永远不会被调用。
【问题讨论】:
我在 heroku 上使用节点的 cron 作业。这是我的顶级内容
var CronJob = require('cron').CronJob;
var dailyJob = new CronJob({
cronTime: '0 0 0 * * *',
onTick: function () {
// Do daily function
console.log('I get called 1 time a day.');
},
start: false
});
dailyJob.start();
【讨论】:
我将详细说明上面@rsp 所说的内容,这样如果其他人发现这个问题,他们就会明白为什么在这里使用Heroku Scheduler 是正确答案。
当您在 Heroku 上运行软件时,Heroku 将获取您的项目,并在 Amazon 上 Heroku 服务器集合中的随机测功机(服务器)上运行它。
出于多种原因(包括帮助在大量 Amazon 服务器上平均分配应用程序负载),Heroku 会定期将您的 dyno 从一台 Amazon 服务器移动到另一台服务器。这每天在幕后自动发生很多次。
这意味着您的应用程序代码在 Heroku 上运行时会一直定期重启。
现在——从最终用户的角度来看,这并不是一件坏事,因为当您的应用程序代码重新启动时,Heroku 会将传入的请求排队,然后在新的应用程序成功重新启动后将它们发送到您的应用程序主持人。所以对于最终用户来说,这种行为是 100% 透明的。
不过,在这里要知道的重要一点是,由于您的应用程序代码可能会随机重新启动,因此您不应该使用它来执行诸如运行需要一段时间才能完成的长任务,或者将要在未来(cron 模块的作用)。
相反:Heroku 创建了一个免费的调度程序插件,您可以使用它基本上说“嘿 Heroku,每分钟运行一次这个 Node 脚本|小时|等等。”
Heroku 提供的调度程序插件将可靠地执行您的 cron 任务,因为 Heroku 会单独跟踪这些计时内容(在您的应用程序逻辑之外)。
希望这会有所帮助!
【讨论】:
在 Heroku 上,您可能需要使用 Heroku 调度程序。
【讨论】: