Rails Sidekiq错误:无法找到对象

时间:2016-06-18 19:52:44

标签: ruby-on-rails redis mongoid sidekiq

我的rails 4应用程序中有几个sidekiq工作者,无法弄清楚进程失败的原因。我将User_id作为字符串传递给worker,但它似乎无法找到用户。但是当我在控制台中搜索相同的ID时,它会找到用户。我究竟做错了什么?这是我的代码。

Controller.rb

  def update
   @user = current_user
    if @user.bill.update_attributes(bill_params)
      RandomWorker.perform_async(@user.id.to_s)
      redirect_to users_dashboard_path, :notice => "Payment Informaton Updated"
    else
      ...  
    end
  end

Randomworker.rb

  def perform(user_id)
    user_id = user_id["$oid"] unless user_id.is_a?(String)
    user = User.find(user_id)
    user.process.update_report 
    user.process.save
  end

我的错误以

的形式返回
RandomWorker  "575a..." Mongoid::Errors::DocumentNotFound: message: Document(s) not found for class User with id(s) 575a.... summary: When calling User.find with an id or array of ids, each parameter...

- 编辑 -

我的db配置文件如下所示:

development:
 adapter: sqlite3
 database: db/development.sqlite3
 pool: 5
 timeout: 5000

production:
 adapter: sqlite3
 database: db/production.sqlite3
 pool: 25
 timeout: 5000

我的mongoid.yml

development:
   # Configure available database clients. (required)
     clients:
   # Defines the default client. (required)
       default:
   # Defines the name of the default database that Mongoid can connect to.
   # (required).
         database: development_db
   # Provides the hosts the default client can connect to. Must be an array
   # of host:port pairs. (required)
         hosts:
            - localhost:27017
         options:

2 个答案:

答案 0 :(得分:2)

我找到了解决方案。我不得不在sidekiq initalizer中放置一个monkeypatch来将user.id视为json。显然,mongoid与sidekiq一起努力,虽然我努力寻找一些文件,但我在另一个不相关的问题上绊倒了答案。 Have to_json return a mongoid as a string

我在initalizer中添加了这个,似乎解决了这个问题

class BSON::ObjectId
  def as_json
    self.to_s
  end
end

答案 1 :(得分:1)

我建议您包含Sidekiq::Web以查看Web界面上排队的作业,以便您可以查看参数以及可能触发的故障。

然而,这也是我前面也遇到过的一个错误,由于我从错误通知程序(Bugsnag)收到的电子邮件数量很多,这让我很沮丧。

我还没有找到最佳解决方案,但我认为数据库已被锁定以便阅读或某些记录在尝试使用之前尚未提交。

Sidekiq的文档在您的模型使用中说after_commit :perform_sidekiq_job, on: :create

然而,我并没有真正尝试过,因为我发现了另一种方法,我的新方法的另一面是我的工作很晚才执行,有时大约10分钟。

RandomWorker.perform_in(5.seconds, user_id)

使用Sidekiq::retry选项失败的可能性较小。

Read more here