我有一些使用delayed_job的小型应用程序。在我的localhost上,一切都很好,但当我将我的应用程序部署到Heroku并单击应该由delayed_job执行的链接时,就不会发生任何事情,"任务"只是保存到表delayed_job
中。
在heroku博客上写的这篇文章中,delayed_job
表中的任务被执行,当运行这个命令时rake jobs:work。
但是我该如何运行这个命令呢?命令应该放在哪里?在代码中,还是从终端控制台?
如果您正在运行Cedar堆栈,请从终端控制台运行以下命令:
heroku run rake jobs:work
如果您正在运行较旧的堆栈(Bamboo、Aspen等):
heroku rake jobs:work
请参阅:https://devcenter.heroku.com/articles/rake
根据delayed_job
文档,您还可以通过编程启动一个工作者:
#!/usr/bin/env ruby
require File.dirname(__FILE__) + '/../config/environment'
Delayed::Worker.new.start
您应该使用Procfile为dynos指定命令。例如,您的Procfile中会有这样的内容:
appDir/Procfile
web: bundle exec rails server -p $PORT
worker: bundle exec rake jobs:work
要在你的开发机器上使用它,你应该使用Foreman,这在文档中都有解释。
https://devcenter.heroku.com/articles/procfile
在我们的案例中,我们每月只运行一次延迟的作业,所以不想让工人dyno不断运行。
为了解决这个问题,我们将作业(使用.delayed
)排队,然后使用Heroku平台API在一次性工作者中生成rake jobs:workoff
。API调用的返回速度相对较快。
PlatformAPI.connect_oauth(ENV["YOUR_HEROKU_KEY"]).dyno.create(ENV["YOUR_HEROKU_APP_NAME"],{command: 'rake jobs:workoff'})