Heroku - 如何启动作业工作者 (延迟作业)?

6
我有一些使用delayed_job的小程序。在我的本地计算机上一切正常,但是当我将应用程序部署到Heroku并单击应该由delayed_job执行的链接时,什么也没有发生,“任务”只保存在表中delayed_job
heroku博客的这篇文章中写道,从delayed_job表中获取的任务在运行此命令 rake jobs:work 时被执行。
但是我该如何运行这个命令?该命令应放置在哪里?是在代码中还是从终端控制台中?
3个回答

13

如果你正在运行 Cedar stack,请从终端控制台中运行以下命令:

heroku run rake jobs:work

如果你正在运行旧的堆栈(Bamboo、Aspen等):

heroku rake jobs:work

参见:https://devcenter.heroku.com/articles/rake

根据 delayed_job文档,你也可以以编程方式启动一个工作者(worker):

#!/usr/bin/env ruby
require File.dirname(__FILE__) + '/../config/environment'

Delayed::Worker.new.start 

2
是的,这对我有效。但是我该如何从我的应用程序自动运行此任务? - user984621
1
当您想在队列中有任务时启动一个工作进程时怎么办?您必须拥有一直运行并从队列中取出任务的工作进程吗?这不是在Heroku每天重启dynos时会出现问题吗? - Magne
如果您想要一个能够自动运行任务的工作进程,那么您需要将delayed_job命令作为新进程放入Procfile中,并在Heroku应用程序中至少添加1个工作进程。 - Carlos Ramirez III
这个命令 'heroku run rake jobs:work' 在 Heroku 机器上能用吗?很可能可以,我输入这个命令就不需要做其他的了。worker dyno 会一直监视着。在本地你需要输入 'rake jobs:work' 来监视。但是即使我没有运行 'rake jobs:work' 命令,它也能正常工作。 - Shalafister's

10

你应该使用Procfile来指定动态进程的命令。 例如,你的Procfile可能像这样:

appDir/Procfile

web:     bundle exec rails server -p $PORT 
worker:  bundle exec rake jobs:work

如果想在开发机上使用这个工具,最好使用Foreman。在文档中有详细的解释。

https://devcenter.heroku.com/articles/procfile


1
在我们的情况下,我们只需要每月运行一次延迟任务,因此不想让worker dyno一直运行。为了解决这个问题,我们使用.delayed排队作业,然后使用Heroku平台API在一个一次性worker中生成rake jobs:workoff。API调用相对快速返回。
PlatformAPI.connect_oauth(ENV["YOUR_HEROKU_KEY"]).dyno.create(ENV["YOUR_HEROKU_APP_NAME"],{command: 'rake jobs:workoff'})

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接