几天前工作的工人因某种原因停止工作。
resque日志报告Mongo::OperationFailure
的例外情况,错误为invalid operator: $oid
class SimilarTargets
@queue = :similar_queue
def self.perform(target_id)
source_target = Target.find(target_id)
....
end
end
即使通过rails控制台传入直接字符串,worker也会在Target.find(target_id)上失败。
Target.find(id)在控制台和代码中的其他地方工作正常,我无法弄清楚为什么这个失败了,即使工人类在上周从未改变过。
答案 0 :(得分:8)
你最近升级了Mongoid吗?该错误使得它听起来像.find()方法正在接收像{"$oid": "[STRING]"}
这样的东西,它是Mongo的对象ID的严格json表示。
你可以用这样的东西解决它,假设你只是想快速修复:
target_id = target_id["$oid"] unless target_id.is_a?(String)
答案 1 :(得分:1)
另一个选择是确保当你将Moped :: BSON :: ObjectId排队时,你明确地传入一个字符串表示。如,
Resque.enqueue(MyJob, @mongoid_instance.class.to_s, @mongoid_instance.id.to_s)