【问题标题】:Resque Worker: invalid operator: $oidResque Worker:无效运算符:$oid
【发布时间】:2013-04-04 02:13:55
【问题描述】:

几天前工作的工人由于某种原因停止工作。

resque 日志报告Mongo::OperationFailure 异常,错误为invalid operator: $oid

class SimilarTargets
  @queue = :similar_queue

  def self.perform(target_id)
    source_target = Target.find(target_id)

    ....

  end
end

工作人员在 Target.find(target_id) 上失败,即使通过 rails 控制台传入了一个直字符串。

Target.find(id) 在控制台和代码的其他地方工作正常,我无法弄清楚为什么这会失败,即使工人阶级在上周从未改变过。

【问题讨论】:

    标签: ruby-on-rails-3 mongodb resque


    【解决方案1】:

    你最近升级了 Mongoid 吗?这个错误听起来像是 .find() 方法正在接收类似 {"$oid": "[STRING]"} 的东西,这是 Mongo 对象 ID 的严格 json 表示。

    假设您只想快速修复,您可以通过以下方式解决它:

    target_id = target_id["$oid"] unless target_id.is_a?(String)
    

    【讨论】:

    • 我也遇到过这个问题,你知道为什么会这样吗?在使用 mongoid 对象 ID 创建 Resque 作业时,我遇到了奇怪的不一致行为。我的应用程序是 Sinatra 应用程序,在一个请求处理程序中,它创建了一个新的 Resque 作业,该作业将 mongoid 文档的 ID 作为参数。这项工作工作正常,id 只是被序列化为字符串。但是,这个作业完成后,会将另一个作业排入队列,将同一个对象的 id 传递给下一个作业,并且由于某种原因,第二个作业会获取 ObjectID 的 JSON 版本,而不仅仅是字符串。两个作业的排队方式相同。
    • 正如 MrKurt 所说,Moped::BSON::ObjectId 序列化为 JSON 为 "{\"$oid\":\"#{to_s}\"}"。当 Resque 将 Object Id 转储到其有效负载时,会在 ObjectId 上调用 to_json,从而在稍后执行作业时对其进行存储和编组。
    【解决方案2】:

    另一种选择是确保当您将 Moped::BSON::ObjectId 加入队列时,您会显式传递字符串表示形式。例如,

    Resque.enqueue(MyJob, @mongoid_instance.class.to_s, @mongoid_instance.id.to_s)
    

    【讨论】:

      猜你喜欢
      • 2014-07-21
      • 2013-01-29
      • 2014-01-06
      • 1970-01-01
      • 1970-01-01
      • 2016-01-05
      • 1970-01-01
      • 2012-02-20
      相关资源
      最近更新 更多