当前位置: 首页 > 知识库问答 >
问题:

Pika Exchange\u声明回调中的Exchange名称

祝高阳
2023-03-14

我尝试在回调中使用exchange名称。我在Pika中使用SelectConnection适配器处理异步请求

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

我已经弄明白,反应属于皮卡类型。框架但我如何从那里开始呢?交易所是否保证按顺序申报?

共有3个答案

吕德惠
2023-03-14

似乎无法读取回调中的exchange名称。相反,您需要做的是保留一个计数器,以便知道何时创建了所有交易所:

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

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

戈巴英
2023-03-14

您可以相应地链接回调以控制安装过程。只需逐步建立您的交易所和队列。这更为冗长,但您可以控制

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.
        # ...
卫鸿朗
2023-03-14

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

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

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

 类似资料:
  • 我有一个简单的枚举类,我想在其中有一个名为name的字段。 不幸的是,这在静态编程语言中似乎不起作用。编译失败,消息: 错误:(9,5)静态编程语言:冲突声明:枚举条目名称,公共最终val名称:字符串 同样的Enum类作为Java代码工作正常。如何用静态编程语言解决这个问题?

  • 我有困难建立一个有3个类的结构。我不确定包含/转发声明。 下面的代码一直在编译,直到我在inclino.h中添加名称空间和枚举。我从Inclinomeasure.h收到“Inclino尚未声明”。 倾斜度。h 倾斜度 倾角读数.h 结构正确吗?如何访问其他类中的枚举? 提前道谢。 编辑:我修复了名称空间的问题,把它放在一个新的文件,包括由3类。但我似乎误用了include/forward声明。

  • 如何在命名空间中转发声明类。例如,下面是一个库的头文件,用户不需要知道私有的myPtr,所以当包含在头文件下面时,不需要包含boost头文件。那么我如何向前声明boost::shared_ptr以启用用户代码编译呢? MyClass.h

  • 本文向大家介绍javascript中声明函数的方法及调用函数的返回值,包括了javascript中声明函数的方法及调用函数的返回值的使用技巧和注意事项,需要的朋友参考一下

  • 问题内容: 如何在JavaScript中创建名称空间,以使我的对象和函数不会被其他同名对象和函数覆盖?我使用了以下内容: 有没有更优雅或更简洁的方法? 问题答案: 我喜欢这个:

  • 问题内容: 我正在编写一个小程序,以有序的方式定时显示我的Rubik立方体解。但是Python(3)一直困扰着我关于全局声明之前使用时间的困扰。但是奇怪的是,它在开始时就声明为(是,是列表),然后在函数(他抱怨的地方)中再次声明为,并使用对其进行“全局”处理。这是我的代码,因此您可以根据需要进行分析: 任何帮助将不胜感激,因为我是Python世界的新手:) 问题答案: 全局声明是当你声明是 如果声