Нужно ли помещать все в приложение / работники для sidekiq? - PullRequest
1 голос
/ 24 апреля 2019

В настоящее время я перехожу с DJ на sidekiq и у меня есть много старых рубиновых объектов, которые я бы использовал следующим образом:

Delayed::Job.enqueue(SomeService.new(id))

Я подумал, что могу просто переместить SomeService в папку app/workers и добавить include Sidekiq::Worker, но он никогда не попадает в очередь sidekiq, а просто вызовы выполняются на месте

class SomeService
  include Sidekiq::Worker

  def initialize(id)
    @some_instance = SomeClass.find_by(id: id)
  end 

  def perform
    @some_instance.do_something
  end
end

так что вместо этого я должен создать работника sidekiq для вызова службы

class SomeServiceWorker
  include Sidekiq::Worker

  def perform(id)
    SomeService.new(id).perform
  end
end

Есть ли способ просто использовать SomeService, который содержит метод инициализации и метод выполнения, поэтому мне не нужно создавать работника для вызова моего объекта службы?

Ответы [ 2 ]

1 голос
/ 25 апреля 2019

Sidekiq не очень заботится о том, где файлы и / или как они названы, если они включают Sidekiq::Worker. Соглашение, однако, состоит в том, чтобы поместить всех рабочих в каталог app/workers и назвать их как MyWorker.

Вы можете затем назвать их как:

MyWorker.perform_async params
1 голос
/ 24 апреля 2019

Только одна ошибка, которую вы сделали, вы забыли добавить слово «рабочий» в название вашего класса в первом файле!

class SomeServiceWorker
  include Sidekiq::Worker

  def initialize(id)
    @some_instance = SomeClass.find_by(id: id)
  end 

  def perform
    @some_instance.do_something
  end
end

И этот код запустит ваш рабочий

SomeServiceWorker.new(id).perform
...