2016-12-02 56 views
0

我目前在Ruby中使用我的應用程序啓用隊列。我用sidekiq並有定義如下工人類:Sidekiq和紅寶石中的排隊

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 

這個工作的罰款,每次的睡眠完成後,下一個排隊的任務開始。

在我的情況下,我需要排隊或開始下一個排隊的項目,只有當我決定。它將由外部事件觸發。在我的 'api.rb'

,我已經加入:

post '/response/?' do 
    next_task 
end 

代碼工作的方式是 '/接收' 可排隊10個請求。第一個請求會觸發一個特定的動作(發送一個post命令給服務器)。

我希望遠程服務器通過「/ response」向我發送請求,告訴我該操作已完成。當收到此響應時,我使用'next_task'api刪除正在運行並且現在已完成的前一個任務,並移至下一個排隊的任務。

任何想法,如何創建一個自定義觸發器來排隊和開始新的工作。是否有信號讓我避免sidekiq框架去隊列,直到我發送一個特定的信號。

的Merci

回答

0

要刪除的Sidekiq隊列中的作業,你將不得不遍歷整個隊列。這不是隊列的慣用用法。

恐怕我不明白你到底想要做什麼。只要記住,你可以存儲狀態Sidekiq隊列之外,例如,你可以有對工作的典範:

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

,然後在工作人員:

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

而且在工作:

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

是的,這就是我寫的。在我的示例中,使用sidekiq隊列作爲'喚醒事件',每10秒鐘一次,並將真實隊列存儲在數據庫中 - 模型「Job」中。 –