在Heroku上,我使用delayed_job来运行异步任务。一切顺利,直到我做一个git push heroku master,然后Heroku环境杀死正在进行的任何工作线程。
这里的问题是这些作业永远不会被重新排队,因为我的数据库中的delayed_job表显示它们仍处于锁定和运行状态,即使过去曾经为它们提供服务的工作人员已经死了。
如何防止出现这种情况?我希望Heroku在关闭之前等待正在进行的所有延迟作业完成或错误输出,或者至少终止它们并允许在服务器重新启动后从应用的更改重新启动后为其分配新工作人员通过我的更新。
答案 0 :(得分:2)
看起来您可以配置DJ处理SIGTERM并将正在进行的作业标记为失败(因此它们将重新启动):
使用此设置通过在初始化程序中添加此项来在TERM信号上抛出异常:
Delayed::Worker.raise_signal_exceptions = :term
此答案中的更多信息: https://stackoverflow.com/a/16811844/1715829