我有一个简单的 resque 作业,它接受一个模型 ID,获取它,然后对获取的项目调用一个方法。
class CupcakeWorker
@queue = :cupcake_queue
def self.perform(cupcake_id)
@cupcake = Cupcake.find(cupcake_id)
@cupcake.bake
end
end
我使用“enqueue”方法从 Controller 操作中将其排队
def bake
Resque.enqueue(CupcakeWorker, params[:cupcake_id])
render :json => 'Baking...'
end
作业排队并正确执行。但是,如果我修改数据库中记录的数据并继续将作业再次排队,则操作不会使用新值执行。
如果我重新启动 resque 工作进程,我只能让它获取新值。 resque 是否正在缓存对象?有没有办法确保每次调用 worker 时都从数据库中重新获取它?
最佳答案
这个答案有点粗糙,但可以工作。在进行任何处理之前,您可以在 ActiveRecord 模型上调用 reload
。这会强制 ActiveRecord 更新数据。
然后 worker 看起来像这样:
class CupcakeWorker
@queue = :cupcake_queue
def self.perform(cupcake_id)
@cupcake = Cupcake.find(cupcake_id).reload
@cupcake.bake
end
end
不过,恐怕我不知道为什么 Resque 会这样做。尝试 Sidekiq看看你是否能得到更好的结果。
关于ruby-on-rails - Resque缓存事件记录调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9995599/