0

Resque と Resque Schedule を使用して、アプリケーションの開始時にすぐに実行する必要があるジョブを開始しています。その他のスケジュールされたジョブは、30 秒ごとに読み込まれます。

これは私の config/initializers/redis.rb のコードです

require 'rake'
require 'resque'
require 'resque/server'
require 'resque_scheduler/tasks'
# This will make the tabs show up.
require 'resque_scheduler'
require 'resque_scheduler/server'

uri = URI.parse(ENV["REDISTOGO_URL"])
REDIS = Redis.new(:host => uri.host, :port => uri.port, :password => uri.password)
Resque.redis = REDIS
Dir["#{Rails.root}/app/workers/*.rb"].each { |file| require file }
Resque.enqueue(AllMessageRetriever)
Resque.schedule = YAML.load_file(Rails.root.join('config', 'schedule.yml'))

アプリケーションが起動すると、AllMessageRetriever は 1 回だけではなく 2 ~ 3 回実行されます。初期化子は複数回呼び出されますか? これは、Heroku とローカル環境の両方で発生しますか?

Resque-Scheduler で、実行時に一度だけ実行される遅延ジョブを設定することは可能ですか?

AllMessageRetriever のコード。基本的に、テーブルをループし、外部 API を呼び出してデータを取得し、それをテーブルに更新します。初期化ファイルにエンキューメソッドを追加すると、このタスク全体が2〜3回発生します

 require 'socialcast'
module AllMessageRetriever
    @queue = :message_queue
    def self.perform()
        Watchedgroup.all.each do |group|    
            puts "Running group #{group.name}"
            continueLoading=true
            page=1
            per_page=500
            while(continueLoading == true)
                User.first.refresh_token_if_expired
                token = User.first.token
                puts "ContinueLoading: #{continueLoading}"
                @test = Socialcast.get_all_messages(group.name,token,page,per_page)

                messagesArray =  ActiveSupport::JSON.decode(@test)["messages"]
                puts "Message Count: #{messagesArray.count}"
                if messagesArray.count == 0
                    puts 'count is zero now'
                    continueLoading = false
                else
                    messagesArray.each do |message|
                        if not Message.exists?(message["id"])   
                            Message.create_with_socialcast(message, group.id)
                        else
                            Message.update_with_socialcast(message)
                        end
                    end
                end
                page += 1
            end
            Resqueaudit.create({:watchedgroup_id => group.id,:timecompleted => DateTime.now})
        end
        # Do anything here, like access models, etc
        puts "Doing my job"
    end
end
4

1 に答える 1

2

レーキ

まず、なぜ init でキューに入れようとしているのですか?

イニシャライザから呼び出されるrake タスクに委任する方がはるかに良いでしょう。

これにより、初期化プロセスへの依存がなくなり、多くの問題が解決されるはずです。他の場所でより適切に処理されるため、これを初期化子自体に入れません(モジュール性


問題

この行が問題を引き起こしていると思います:

Resque.enqueue(AllMessageRetriever)

の内容を確認せずに、 (モジュール/クラス?) が結果を 2/3 回返し、Resque が (2/3 回) データセットをキューに追加するAllMessageRetrieverと推測します。AllMessageRetriever

間違っている可能性がありますが、それは理にかなっており、問題はResque/Initializersではなく、AllMessageRetrieverクラスであることを意味します

見せていただけると助かります!

于 2014-02-23T12:58:46.590 に答える