3

ある時点で fb からの大量のデータをデータベースと同期する必要があるアプリケーションを構築しているため、遅延ジョブを使用してこれをバックグラウンドにプッシュしようとしています。私の Delayed Job クラスの一部は次のようになります。

class FbSyncJob < Struct.new(:user_id)
  require 'RsvpHelper'

  def perform
    user = User.find(user_id)
    FbSyncJob.sync_user(user)
  end

  def FbSyncJob.sync_user(user)
    friends = HTTParty.get(
      "https://graph.facebook.com/me/friends?access_token=#{user.fb['token']}"
    )
    friends_list = friends["data"].map { |friend| friend["id"] }
    user.fb["friends"] = friends_list
    user.fb["sync"]["friends"] = Time.now
    user.save!
    FbSyncJob.friend_crawl(user)
  end
end

RsvpHelper住むクラスとlib/RsvpHelper.rb。したがって、アプリケーションのある時点でDelayed::Job.enqueue(FbSyncJob.new(user.id))、既知の有効なユーザーを呼び出します。私が設定したワーカーは、ジョブが正常に完了したことさえ教えてくれます。

1 jobs processed at 37.1777 j/s, 0 failed

ただし、データベースでユーザーを確認すると、友人リストが更新されていません。私は何か間違ったことをしていますか、それとも何ですか?これが私を夢中にさせてきた助けをありがとう。

4

1 に答える 1

6

Delayed::Job.enqueue遅延ジョブテーブルにレコードを配置しますが、ジョブコードを実行するには別のプロセスを実行する必要があります(メソッドを実行します)

通常、開発ではこれは次のようになりますbundle exec rake jobs:work(注:コードを変更するときはいつでもこのrakeタスクを再起動する必要があります。変更は自動ロードされません)

私は通常、開発中に次のものを遅延構成に入れます-これは遅延ジョブテーブルにレコードを置くことはなく、すべてのバックグラウンドコードを同期的に(開発中)実行し、デフォルトでは、railsはコードへの変更をリロードします

Delayed::Worker.delay_jobs = !(Rails.env.test? || Rails.env.development?)

于 2013-03-13T19:29:07.143 に答える