【发布时间】:2013-02-12 02:51:54
【问题描述】:
我有一个简单的 resque 作业,它接受模型 ID,获取它,然后调用获取的项目的方法。
class CupcakeWorker
@queue = :cupcake_queue
def self.perform(cupcake_id)
@cupcake = Cupcake.find(cupcake_id)
p @cupcake
end
end
我从 Cupcake 的模型中排队,after_commit 使用 'enqueue' 方法
def bake
Resque.enqueue(CupcakeWorker, self.id)
end
作业排队并正确执行。但是,如果我在数据库中或通过 UI 修改记录的数据并继续对作业进行排队,则不会使用新值执行操作。
如果我重新启动 resque 工作进程,我只能让它获取新值。 resque 是否正在缓存对象?有没有办法确保每次调用工作人员时都从数据库中重新获取?
编辑:
我什至提取了查询日志......提交发生在获取纸杯蛋糕的选择查询之前...... 所以这既不是订单的竞争条件,也不是查询获取它时的缓存问题...... 我一无所知的家伙..这可能是什么? 顺便说一句,我在 rails 2.3.8 和 redis n resque 组合中使用 after_commit gem
【问题讨论】:
-
我不明白的是,您正在从您的工作人员那里调用 Cupcake@bake,它再次将任务排入队列。对吗?
-
对不起我的错误......它的一些功能......我已经编辑了它......重点是正在打印它,并且 updated_at 指向以前保存的时间,而不是最近的提交总是......
-
@Hari 太奇怪了,我想
bake在after_commit块中被调用了你也看到[CACHE] 喜欢在你的日志中思考当你在resque 中执行Cupcake.find(cupcake_id)时,理想情况下缓存不应该出现在图片中,因为 resque 毕竟不是 rails 进程 -
是的,在 after_commit 中调用了 bake。我没有看到任何类似缓存的东西,并且每次数据库查询进入 SQL 日志时,都会发生在更新查询之后触发 after_commit 之后。 ..它仍然在获取旧对象..我完全不知道你,你这很奇怪:)
标签: ruby-on-rails activerecord redis resque