【发布时间】:2013-03-04 21:47:10
【问题描述】:
我使用 DelayedJob 在后台处理某些任务。
例如,在我的应用程序中,用户可以“点赞”一条消息,当这种情况发生时,发帖人会收到通知。此通知在后台处理。
有时,点赞者决定在通知发出之前撤消他的操作并删除他的“点赞”。在这些情况下,后台代码会遇到“RecordNotFound”错误,因为“like”不再存在。
我以为我是通过挽救错误来处理这种情况的(这里的 self 是 Like):
def send_push_notifications
begin
user = self.message.user
message = "#{self.user.name} liked your workout"
Urbanairship::push_now(user, message, ["message", self.message.id]) if self.user != user
rescue ActiveRecord::RecordNotFound
# Do nothing
end
end
但是,实际上这似乎并不能挽救错误,因为我仍然在日志中看到此类错误:
{ActiveRecord::RecordNotFound, class: Like , primary key: 1557
/app/vendor/bundle/ruby/1.9.1/gems/delayed_job-3.0.2/lib/delayed/serialization/active_record.rb:12:in `rescue in yaml_new'
/app/vendor/bundle/ruby/1.9.1/gems/delayed_job-3.0.2/lib/delayed/serialization/active_record.rb:6:in `yaml_new'
/usr/local/lib/ruby/1.9.1/syck.rb:135:in `transfer'
/usr/local/lib/ruby/1.9.1/syck.rb:135:in `node_import'
/usr/local/lib/ruby/1.9.1/syck.rb:135:in `load'
/usr/local/lib/ruby/1.9.1/syck.rb:135:in `load'
任何想法为什么我的救援声明在这种情况下不起作用?
【问题讨论】:
-
在 Urbanairship::push_now 调用之前它会失败吗?你能粘贴整个堆栈跟踪吗?
-
抱歉,这里是完整的堆栈跟踪:gist.github.com/pejmanjohn/8cf9f1f1d55a90f1ae39
-
您确定错误发生在您的
begin和rescue之间吗?尝试在begin之后直接添加raise ActiveRecord::RecordNotFound。如果可行,并且被捕获,请将其直接移至rescue之前并尝试。也许这可以给你一些线索...... -
@244an 这是一个公平的观点。我通过在调用者上添加另一个开始/救援到此方法进行测试,但我仍然看到问题。另外,这是我在 DelayedJob 中看到的,它指出处理程序是“send_push_notifications”。还有其他想法吗? dl.dropbox.com/u/443447/…
-
你的一切都升级了吗? DelayedJob 正在反序列化 YAML 和所有爵士乐。也许那里有不兼容?除此之外,有没有办法让你显式调用 Like#find 并绕过 DJ 的内置内容。
标签: ruby-on-rails delayed-job rescue