我在rails中有一个后台作业进行一些处理,如果该作业(rake任务)进程由于此异常而终止,因为SignalException:SIGHUP,我想发送一封电子邮件,以便我们可以重新启动rake。
是否有可能从这个例外中解救,虽然我的处理无论如何都会终止,但至少如果我可以在终止之前发送电子邮件。
请帮忙。
示例代码:
task :generate_best_bets_for_all_users do
begin
// do some processing
// if something is wrong
rescue SignalException => e
// OK? to rescue this exception?, is this possible? I want to send email here
rescue StandardError => e
// notify for other failures
end
end
PS:这个过程在heroku上运行一个独立的dyno,比如 - heroku run:detached rake-name --app = app-name
答案 0 :(得分:1)
您始终可以使用Signal.trap
来抓住内容:
Signal.trap('HUP') do
send_panic_email!
end
在拯救信号时尽量不要做太费劲的事情,你可以做的事情有限制,如果违反这些限制你可能会遇到错误。我认为限制取决于信号和操作系统。
答案 1 :(得分:0)
根据您的需求,使用Sidekiq之类的方法可能会更好。您的val params = RequestParams()
params.put("userid", prefs!!.getLong("userid", 0))
params.put("nickname", prefs!!.getString("nickname", ""))
params.put("file", finalInputSteam)
任务可能会产生一个作业,如果服务器被杀死,Sidekiq将自动将该作业推回到队列中。如果需要定期执行某项工作,则可以使用Heroku scheduler自动触发任务。听起来这是一项长期运行的工作,因此,在这种情况下,调度程序应触发单独的后台作业,这一点很重要,否则它可能会得到killed the next schedule interval。