2016-12-02 1 views
0

현재 내 응용 프로그램에서 큐를 사용할 수 있도록 루비에서 썼습니다.Ruby에서 Sidekiq 및 unqueueing

class Worker 
    include Sidekiq::Worker 

    def perform(params) 
    sleep 10 
    @@logger.info("--------------------------") 
    @@logger.info("Request received") 
    @@logger.info("--------------------------") 
    end 
end 

내 주요 진입 점에서 호출하고 'api.rb'

post '/receive/?' do 
    @@logger.debug("/retrieve endpoint received") 
    Worker.perform_async @params 
end 

슬립은이 작업 벌금마다 호출 : 나는 다음과 같이 작업자 클래스를 정의 sidekiq를 사용하고 있습니다 완료되면 다음 대기중인 작업이 시작됩니다.

제 경우에는 결정할 때만 대기열에있는 다음 항목을 대기열에 추가하거나 시작해야합니다. 외부 이벤트에 의해 트리거됩니다. 내 'api.rb'에서

는, 내가 추가 한 : 코드가 작동

post '/response/?' do 
    next_task 
end 

방법은 '/ 수신'(10 개) 요청을 대기 할 수 있다는 것입니다. 첫 번째 요청은 특정 작업 (서버에 게시 명령 보내기)을 트리거합니다.

원격 서버가 '/ response'를 통해 요청을 보내면 작업이 완료되었음을 알립니다. 이 응답을 받으면 'next_task'API를 사용하여 실행중인 이전 작업을 제거하고 이제 완료하고 다음 대기열로 이동합니다.

새 작업을 언큐 (unqueue)하고 시작하기위한 맞춤 트리거를 만드는 방법. 특정 신호를 보낼 때까지 사이드 키 프레임 워크에서 큐를 푸는 것을 피할 수있는 신호가 있습니까? Sidekiq 대기열에서 작업을 삭제하려면 메르

답변

0

, 당신은 전체 큐를 반복해야합니다. 대기열을 관용적으로 사용하는 것은 아닙니다.

나는 정확히 당신이 무엇을하려고하는지 이해하지 못한다.

def perform 
    job = Job.find_oldest_unexecuted  
    if job 
    job.execute! 
    else 
    # wait another 10 seconds 
    Worker.perform_in(10.seconds) 
    end 
end 

그리고 욥 : 작업자의 다음

post '/receive/?' do 
    job = Job.create(@params) 
    Worker.perform_in(10.seconds) 
end 

과 : 그냥 당신이 작업 모델을 가질 수 있습니다 예를 들어 당신의 Sidekiq 큐의 외부 상태를 저장할 수있는 기억

class Job < ActiveRecord::Base 
    def self.find_oldest_unexecuted 
    where(executed_at: nil).order(:id).first 
    end 
    def execute! 
    # do what needs to be done here 
    update_attribute(:executed_at, Time.zone.now) 
    end 
end 
+0

내가하려는 것은 다음 작업의 시작을 제어하는 ​​것입니다. 기본적으로 대기열은 이전 작업이 완료되면 자동으로 새 작업을 시작합니다. 필자의 경우 원격 서버에서 작업이 수행되고 원격 작업이 끝나면 제어 할 수 없기 때문에 요청할 때만 다음 작업을 시작해야합니다. – Seb

+0

예, 그게 제가 쓴 것입니다. 사이드 키 큐를 'wake-up-event'(10 초마다)로 사용하고 실제 큐를 데이터베이스에 저장하십시오. –