14

理解できません。

Sidekiq のドキュメントによると、各ワーカー (私の場合は FeedWorker と呼ばれます) には perform と呼ばれるメソッドを 1 つだけ含めることができます。では、同じワーカーで複数のメソッドを実行したい場合はどうすればよいでしょうか?

たとえば、私の 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

performmethod は Worker のエントリ ポイントです。その中には、必要に応じてコードを整理するために、必要な数のインスタンス メソッドを作成できます。ただし、ワーカー コードをできるだけスリムに保つことをお勧めします。たとえば、その内部から他のオブジェクトを呼び出すことは、それを実現する方法です。コードのテストも簡単になります。

于 2013-04-28T13:18:49.253 に答える
3

私はしばらくの間同じ質問をしていましたが、今ではかなり単純な解決策があります. docsで説明されているように、任意のクラスで Delayed Extension メソッドを使用します。

# 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 メソッドを使用しない限り、ワーカーごとのオプションが使用されないことです。

于 2015-02-12T22:06:28.647 に答える