14

我不明白。

根据 Sidekiq 文档,每个工人(我的称为 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

无聊和丑陋的代码。那里一定有更好的。任何帮助表示赞赏!

4

2 回答 2

7

perform方法是你的 Worker 的入口点。在其中,您可以根据需要创建任意数量的实例方法,以最适合您需要的方式组织代码。不过,保持工作代码尽可能精简是一个很好的做法。例如,从其中调用其他对象是实现此目的的一种方法。你会发现你的代码也更容易测试。

于 2013-04-28T13:18:49.253 回答
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 方法,否则不会使用 per-worker 选项。

于 2015-02-12T22:06:28.647 回答