我不明白。
Per Sidekiq文档中,每个worker(我的名为FeedWorker)只能包含一个名为perform的方法。那么,如果我想通过同一个工作者运行多种方法呢?
例如,我的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
无聊和丑陋的代码。那里一定有更好的。 任何帮助表示赞赏!
答案 0 :(得分:6)
perform
方法是您的工作者的入口点。在其中,您可以根据需要创建任意数量的实例方法,以便根据您的需要组织代码。尽管让工作人员代码尽可能地保持苗条,但这是一个很好的做法。例如,从内部调用其他对象是实现这一目标的一种方法。您会发现您的代码也更容易测试。
答案 1 :(得分:3)
我有一段时间有同样的问题,现在有一个相当简单的解决方案:在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
任何类都可以延迟,所以如果您不打算使用perform_async方法,则不需要包含Sidekiq :: Worker。
我遇到的问题是,除非你通过perform_async方法,否则不会使用每个工作者的选项。