我一直在 Heroku 上使用 resque,它会不时用 SIGTERM 中断你的工作。
到目前为止,我已经用一个简单的方法处理了这个问题:
def process(options)
do_the_job
rescue Resque::TermException
self.defer options
end
我们已经开始使用 resque-status 以便我们可以跟踪作业,但是上面的方法显然打破了这一点,因为当作业实际上被推迟到另一个作业时,它会显示已完成。
我目前的想法是,与其在 resque 中推迟当前的工作,还需要另一个工作来重新排队由于 SIGTERM 而失败的工作。
诀窍在于一些工作更复杂:
def process(options)
do_part1 unless options['part1_finished']
options['part1_finished']
do_part2
rescue Resque::TermException
self.defer options
end
当 do_part1 重复时,简单地删除救援并简单地重试这些作业会导致异常。