0

我正在使用Resque和Resque Schedule啓動一個必須在應用程序啓動時立即運行的作業。其他計劃作業每30秒加載一次。在Rails的應用程序啓動時安排在Heroku上的一次性Resque作業

這是我的配置/初始化/ 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獲取運行,而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 

回答

1

耙添加排隊方法

首先,爲什麼你想排隊上初始化?

你會好得多委託給從初始化程序調用的rake task

這將刪除對初始化過程的依賴,這應該清除很多東西。我不會把這個在初始化本身,因爲它會得到更好的在其他地方(modularity


處理問題

我覺得這行導致了問題:

Resque.enqueue(AllMessageRetriever) 

沒有看到AllMessageRetriever的內容,我推測你是AllMessageRetriever(模塊/類?)將返回結果2/3次,導致Resque將(2/3次)數據集添加到隊列

可能是錯的,但它是有意義的,並意味着你的問題是不是與Resque/Initializers,但你的AllMessageRetriever類,如果你表現出它

將是一個很大的幫助!

+0

Hi @RichPeck我添加了工人類的代碼。我現在已經將它添加到Rake任務,並且它工作正常。即只有一次。但唯一的問題是,我必須手動調用任務,並且它不會自動完成 – ganeshran

+1

這是個好消息 - 也許您可以爲任務創建初始化程序?像 ''#config/initializers/messages.rb Rake :: Task [「your:task」]。invoke''' –

相關問題