2015-11-30 2 views
0

Один образец я часто используется с рабочими Sidekiq является определение perform_all метод:«Не называй .delay по классу Sidekiq :: Worker, называют .perform_async»

class ModelMutateWorker 
    include Sidekiq::Worker 

    def perform(id) 
    model = Model.find(id) 
    # Mutate model in some way 
    end 

    def self.perform_all 
    batch = Sidekiq::Batch.new 
    batch.description = "#{self.name}.#{__method__}" 
    batch.jobs do 
     Sidekiq::Client.push_bulk('class' => self, 'args' => Model.ids.map { |id| [id] }) 
    end 
    return batch 
    end 

end 

В этом несколько надуманный пример , звонки Model.ids и Sidekiq::Client.push_bulk являются несколько дорогими. При выполнении этого действия из веб-запроса или командной строки предпочтительно также откладывать их.

ModelMutateWorker.delay(queue: "my_other_queue").perform_all 

Однако Sidekiq 4.0 removed.delay, .delay_for и .delay_until от Sidekiq::Worker. Я не помню, чтобы когда-либо видел предупреждение об этом. Есть ли СУХОЙ способ вернуть это поведение?

ответ

0

Переместите perform_all в модель или создайте новый класс BulkOperation, чтобы его удержать.

+0

Чтобы уточнить, вы имеете в виду нового работника «BulkOperation» для каждого прежнего метода 'perform_all'? – jelder

+0

Простой класс, который поддерживает этот метод. Модель может восприниматься как аргумент. –

Смежные вопросы