我有一个简单的resque作业,它接受一个模型id,获取它,然后在获取的项目上调用一个方法。
class CupcakeWorker
@queue = :cupcake_queue
def self.perform(cupcake_id)
@cupcake = Cupcake.find(cupcake_id)
@cupcake.bake
end
end
我使用'enqueue'方法
从控制器操作中排队def bake
Resque.enqueue(CupcakeWorker, params[:cupcake_id])
render :json => 'Baking...'
end
作业排队并正确执行。但是,如果我修改数据库中的记录数据并继续将作业排队,则操作不会使用新值执行。
如果我重新启动resque工作进程,我只能获取它来获取新值。是resque缓存对象?有没有办法确保每次调用worker时都从数据库中重新获取?
答案 0 :(得分:0)
这个答案有点粗糙,但可以奏效。在进行任何处理之前,您可以在ActiveRecord模型上调用reload
。这会强制ActiveRecord更新数据。
然后工人看起来像这样:
class CupcakeWorker
@queue = :cupcake_queue
def self.perform(cupcake_id)
@cupcake = Cupcake.find(cupcake_id).reload
@cupcake.bake
end
end
但是,恐怕我不知道为什么Resque可能会这样做。试试Sidekiq,看看你是否获得了更好的结果。