Подтвердить что ты не робот

Несколько методов для каждого рабочего

Я не понимаю.

В документации Per Sidekiq каждый рабочий (мой называется FeedWorker) может содержать только один метод, называемый perform. Ну, а что, если я хочу запускать методы mulitple через одного и того же работника?

Например, мой FeedWorker (вы уже догадались, он обрабатывает фид активности) должен запускать следующие 3 метода:

announce_foo
announce_bar
invite_to_foo

Я не думаю, что это необоснованное ожидание. Я уверен, что другие люди это рассмотрели. Я не гений, но я знаю, что я не нарушаю новые предположения. Однако неясно, как это можно сделать.

Прямо сейчас, похоже, мне нужно закодировать таким образом:

def perform(id, TYPE)
  if TYPE == BAR
    Bar.find(id) and_announce_bar
  else
    Foo.find(id) and_announce_foo
  end
end

Скучный и уродливый код. Там должно быть лучше. Любая помощь ценится!

4b9b3361

Ответ 1

perform метод - это точка входа вашего Рабочего. Внутри него вы можете создать столько методов экземпляра, сколько хотите, чтобы организовать свой код, как он наилучшим образом соответствует вашим потребностям. Это хорошая практика, хотя держать рабочий код как можно более тонким. Вызов других объектов изнутри, например, является способом достижения этого. Вы обнаружите, что ваш код будет легче протестировать.

Ответ 2

У меня был тот же вопрос на некоторое время, и теперь у вас довольно простое решение: используйте метод Delayed Extension для любого класса, как описано в docs, например:

# Usage: EmailWorker.delay.do_something

class EmailWorker
  class << self
    def send_this(attrs)
      MyMailer.some_action(attrs).deliver
    end

    def send_that(attrs)
      MyMailer.another_action(attrs).deliver
    end
  end
end

Любой класс может быть отложен, поэтому не нужно включать Sidekiq:: Worker, если вы не собираетесь использовать метод perform_async.

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