0

Resque 및 Resque Schedule을 사용하여 응용 프로그램 시작시 즉시 실행해야하는 작업을 시작합니다. 다른 예약 된 작업은 30 초마다로드됩니다. 레일에서 응용 프로그램 시작시 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를 호출하여 데이터를 가져온 다음이를 테이블로 업데이트합니다. 내가 초기화 파일

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

레이크 인큐 방법을 추가 할 경우 전체 작업은 첫째

, 당신은 왜 초기화에 대기하려고 2 ~ 3 번됩니까?

이니셜 라이저에서 호출되는 rake task에 위임하는 것이 훨씬 더 효율적입니다.

이렇게하면 초기화 프로세스에 대한 종속성이 제거되므로 많은 일이 해결됩니다.

Resque.enqueue(AllMessageRetriever) 
: 그것은 더 나은 내가이 줄이 문제를 일으키는 생각하는 곳 ( modularity)


문제

을 처리 할 것 같은 나는, 이니셜 라이저 자체에 넣고 않을 것

AllMessageRetriever의 내용을 보지 않고서는 AllMessageRetriever (module/class?)이 결과를 2/3 회 반환 할 것이므로 Resque가 (2/3 시간) 데이터 세트를 큐

잘못 될 수 있지만, 이해하고, 문제가 Resque/Initializers하지 의미하지만 AllMessageRetriever 클래스 당신이 그것을 보여 주었다 경우

가 큰 도움이 될겠습니까 것입니다!

+0

안녕하세요 @RichPeck 나는 작업자 클래스의 코드를 추가했습니다. 나는 이제 Rake 작업에 추가했으며 정상적으로 작동합니다. 즉 한 번만. 하지만 유일한 문제는 수동으로 작업을 호출해야하며 자동으로 수행되지 않는다는 것입니다. – ganeshran

+1

이것은 좋은 소식입니다. 작업의 초기화 프로그램을 만들 수 있습니까? 마찬가지로 '''# config/initializers/messages.rb Rake :: Task [ "your : task"]. invoke''' –