这个任务会检查当前代码块是否正在执行,然后再决定是否要再次执行该代码块。
process = ProcessTime.where("name = 'ad_queue_process'").first
# Return if job is running
return if process.is_running == true
如果Sidekiq在代码块的中途重新启动,更新作业状态的代码将永远不会运行。
# Done running, update the process times and allow it to be ran again
process.update_attributes(is_running: false, last_execution_time: Time.now)
这导致任务从未运行,除非我运行一个更新语句来设置is_running = false
有没有办法在Sidekiq重启之前执行代码?
ProcessTime.transaction do ... end
块中。 - Jay-Ar Polidario在 Heroku 发送 SIGTERM 给您的应用程序之后,它将等待几秒钟,然后发送 SIGKILL 强制关闭它,即使它还没有完成清理。在这个例子中,ensure 块根本没有被调用,程序只是退出:
。因此,如果您的作业“挂起”/需要很长时间才能关闭,那么我的“rescue; ensure”解决方案仍然不是完全可靠的,但希望它不会花费太长时间,因为您只是在ensure
块中执行一个update
;仍然不是100%可靠,例如更新时出现临时数据库超时。 - Jay-Ar Polidariodef perform; # 在此处编写代码...; rescue SignalException => e; raise; ensure; process.update(...); end
- Jay-Ar Polidario