我有一个简单的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缓存对象?有没有办法确保每次调用worker时都从数据库中重新获取?
我甚至提取了查询日志......提交发生在获取Cupcake的select查询之前。 所以这既不是订单的竞争条件,也不是查询提取的缓存问题...... 我是无能为力的家伙......它会是什么? 顺便说一句,我在rails 2.3.8和redis n resque combo中使用了after_commit gem
答案 0 :(得分:0)
您可以尝试使用此代码强制resque命中数据库
ActiveRecord::Base.uncached do
@cupcake = Cupcake.find(cupcake_id)
end
{{}}
中提供了未缓存的内容
这应该有效,除非问题不是真正的缓存问题。如果它适合您,请告诉我们。
答案 1 :(得分:0)
我遇到了完全相同症状的问题
深入挖掘后我发现,我的问题在于命名范围
我在演出中有这样的事情:
letter = Letter.to_process.first
在模特中我有
scope :to_process, where("scheduled_at < ?", Time.now).where('finished_at IS NULL').order('scheduled_at')
这是错误的,因为它始终以与第一次执行命名范围相同的scheduled_at值运行
这是正确的
scope :to_process, lambda { where("scheduled_at < ?", Time.now).where('finished_at IS NULL').order('scheduled_at') }
如果这与你的情况没有任何关系 - 如果你只是普通的查找(id)有问题,试着添加这个
Cupcake.connection.clear_query_cache
在执行方法结束时