2016-12-02 7 views
0

В настоящее время я разрешаю очередь в моем приложении писать в Ruby. Я использую sidekiq и есть определить класс уборщица, как показано ниже:Sidekiq и unqueueing in ruby ​​

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 запросов. первый запрос инициирует конкретное действие (отправляется почтовая команда на сервер).

Я ожидаю, что удаленный сервер отправит мне запрос через «/ response», чтобы сообщить мне, что действие закончено. когда этот ответ получен, я использую api '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 секунд и сохраняйте реальную очередь в базе данных - в модели «Работа» в моем примере. –