2

我有一个简单的 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

4

2 回答 2

0

我遇到了完全相同症状的问题

深入挖掘后我发现,我的问题出在命名范围内

我有这样的表演:

letter = Letter.to_process.first

在模型中我有

scope :to_process, where("scheduled_at < ?", Time.now).where('finished_at IS NULL').order('scheduled_at')

这是错误的,因为它始终以与第一次执行命名范围时相同的 schedule_at 值运行

这是正确的

scope :to_process, lambda { where("scheduled_at < ?", Time.now).where('finished_at IS NULL').order('scheduled_at') }

如果这与您的情况无关 - 如果您对普通的 find(id) 有问题,请尝试添加

Cupcake.connection.clear_query_cache

在您的执行方法结束时

于 2013-08-23T00:44:06.927 回答
0

您可以尝试使用此代码强制 resque 访问数据库

ActiveRecord::Base.uncached do
  @cupcake = Cupcake.find(cupcake_id)
end

未缓存在2.3.8中可用

这应该有效,除非问题不是真正的缓存问题。让我们知道它是否适合您。

于 2013-02-26T17:23:48.027 回答