Pika交易所中的交易所名称

2024-10-01 15:45:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在我的exchange_declare回调中使用交换名。我使用SelectConnection适配器来处理Pika中的异步请求。在

我的想法是首先在程序中建立交换、队列和绑定的列表。然后,我将多个exchange和queue声明分派给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

这将给出以下输出,它清楚地表明交换是先声明的,回调是稍后触发的(如预期的那样):

^{pr2}$

我已经知道responsepika.frame.Method类型,但是从那里我该怎么做呢?交易所是否能保证申报有序?在


Tags: 声明exchange队列onresponsecreatecallbackchannel
3条回答

您可以相应地链接回调以控制安装过程。一步一步建立你的交换和队列。这是更详细的,但你保持控制。在

class ChatServer(object):
    def __init__(self):
        self.channel_in = None
        self.channel_out = None
        cred = pika.PlainCredentials('guest','guest')
        param = pika.ConnectionParameters(host='localhost',
                                          port=5672,
                                          virtual_host='/',
                                          credentials=cred)
        self.connection = pika.SelectConnection(param,self.on_connected)


    def on_connected(self, connection):
        self.connection.channel(self.on_channel_out_open)

    def on_channel_out_open(self,channel):
        self.channel_out = channel
        self.channel_out.exchange_declare(exchange='chatserver_out',
                                          type='direct',
                                          auto_delete=False,
                                          callback=self.on_exchange_declare_out)
    def on_exchange_declare_out(self,method_frame):
        self.channel_out.exchange_declare(exchange='cmd',
                                          type='direct',
                                          auto_delete=False,
                                          callback=self.on_exchange_declare_cmd_out)
    def on_exchange_declare_cmd_out(self,method_frame):
        # now all exchanges are defined.
        # Let's create the queues.
        # ...

闭包是保持代码异步的解决方案:

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

    exchange = "exchangeB"
    callback = self.on_exchange(exchange)
    channel.exchange_declare(callback=callback, exchange=exchange)

def on_exchange(self, exchange):
    def callback(response):
        print(exchange)

    return callback

我在上游打开了一个问题,https://github.com/pika/pika/issues/898

似乎不可能在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

这将有效地使接口在交换声明步骤中同步。在

相关问题 更多 >

    热门问题