2

コールバックで交換名を使用しようとしていexchange_declareます。SelectConnectionPika で非同期リクエスト用のアダプターを使用します。

私の考えは、最初に私のプログラムで交換、キュー、およびバインディングのリストを作成することです。次に、複数の交換とキューの宣言を Pika にディスパッチし、各バインディングに必要なキューと交換が DeclareOK メッセージを受け取るとすぐにバインディングを作成します。

これは、作成するバインディングと関連付けるために、コールバック内の交換とキューの名前を知る必要があることを意味します。

このようなもの:

print "Create A"
channel.exchange_declare(callback=on_exchange, exchange="exchangeA")
print "Create B"
channel.exchange_declare(callback=on_exchange, exchange="exchangeB")

def on_exchange(response):
  # How do I know if this was exchangeA or exchangeB ?
  print "Exchange declared"
  print response

これにより、次の出力が得られます。これは、(予想どおり) 交換が最初に宣言され、コールバックが後でトリガーされることを明確に示しています。

Create A
Create B
Exchange declared
<METHOD(['method=<Exchange.DeclareOk>', 'channel_number=1', 'frame_type=1'])>
Exchange declared
<METHOD(['method=<Exchange.DeclareOk>', 'channel_number=1', 'frame_type=1'])>

responseタイプがpika.frame.Methodであることがわかりましたが、そこからどうすればよいですか? 交換は、おそらく順番に宣言されることが保証されていますか?

4

3 に答える 3

1

exchange_declareコールバックで取引所名を読み取ることができないようです。代わりに、カウンターを保持して、すべての交換がいつ作成されたかを知る必要があります。

class ...:
  def __init__(self):
    self.exchangestocreate = 2

  #...

  def declare_exchanges(self):
    channel.exchange_declare(callback=self.on_exchange, exchange="exchangeA")
    channel.exchange_declare(callback=self.on_exchange, exchange="exchangeB")

  def on_exchange(self, response):
    self.exchangestocreate -= 1
    if self.exhangestocreate == 0:
      # Declare bindings here

これにより、交換宣言ステップでインターフェイスが効果的に同期されます。

于 2013-11-06T06:06:41.553 に答える