0

我使用 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'

任何想法为什么我的救援声明在这种情况下不起作用?

4

2 回答 2

2

Like 对象不存在,因此甚至没有调用具有救援的方法。

尝试将您的延迟方法定义为类方法,而不是实例方法。这样,延迟作业将能够执行该方法,即使该实例不存在。例如,

class Like < ActiveRecord::Base

...

def self.send_push_notifications(like_id=nil)
  begin
    like = Like.find like_id
    user = like.message.user
    message = "#{like.user.name} liked your workout"
    Urbanairship::push_now(user, message, ["message", like.message.id]) if like.user != user
  rescue ActiveRecord::RecordNotFound
    # Do nothing
  end
end

...

end
于 2013-04-18T18:45:33.477 回答
1

我终于通过使用类方法而不是延迟调用的实例方法解决了这个问题。让我以示例的方式向您展示。以下是我之前构建延迟调用的方式:

  def background_send_push_notifications
    self.delay.send_push_notifications
  end

  def send_push_notifications
    message = "#{self.user.name} liked your workout"
    ...
  end

我一直遇到的问题是,用户在喜欢某件事后立即不喜欢是很常见的。这意味着当delayed_job 尝试执行时,Like 对象不再存在,并且我会收到很多“RecordNotFound”错误。

现在,我已将延迟调用转换为在后台执行对象查找并在对象不再存在时返回的类方法。这是新结构

  def background_send_push_notifications
    Like.delay.send_push_notifications(self.id)
  end

  def self.send_push_notifications(id)
    like = Like.find_by_id(id)
    like.send_push_notifications unless like.nil?
  end

  def send_push_notifications
    message = "#{self.user.name} liked your workout"
    ...
  end

希望这对某人有帮助!

于 2013-06-27T17:47:40.363 回答