2

モデル ID を受け取り、それを取得して、取得したアイテムのメソッドを呼び出す単純な resque ジョブがあります。

class CupcakeWorker
  @queue = :cupcake_queue
  def self.perform(cupcake_id)
    @cupcake = Cupcake.find(cupcake_id)
    p @cupcake
  end
end

「enqueue」メソッドを使用して、Cupcake のモデル after_commit からキューに入れます。

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

このコードを使用して、データベースに resque ヒットを強制することができます

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

uncached は2.3.8で利用可能です

問題が実際にキャッシングの問題でない限り、これは機能するはずです。それがあなたのために働くかどうか私たちに知らせてください.

于 2013-02-26T17:23:48.027 に答える
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') }

これがあなたのケースにまったく関係がない場合 - 単純な find(id) だけで問題がある場合は、これを追加してみてください

Cupcake.connection.clear_query_cache

perform メソッドの最後に

于 2013-08-23T00:44:06.927 に答える