Несколько методов для каждого рабочего
Я не понимаю.
В документации 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
Скучный и уродливый код. Там должно быть лучше.
Любая помощь ценится!
Ответы
Ответ 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.