我正在尝试使用pika和扭曲从兔子队列中消费:
- 不断(新消息 ->消耗)
- 一次(新消息 ->消耗一次,在我说之前不要再消耗)
我唯一的输入是这个例子。它涵盖了用例 1。用例 2 呢?
basic_consume
不是以在新消息准备就绪时"通知"的方式实现的吗?为什么启动循环调用是我的"工作"?似乎轮询是针对扭曲的事件循环模式,不是吗?
当使用 twisted 发出 http 请求时,它会发送请求并在返回后继续执行(通过延迟)。为什么这在RabbitMQ/pika中不起作用?
以下是我希望它的工作方式:
- 订阅队列
- 从队列中消耗(除非队列中有消息,否则不会立即触发,每次队列中有新消息时都会触发,我现在忽略qos。
如何使用单个消息,例如basic_get
?我是否需要启动循环呼叫,并在收到消息后停止它?
RabbitMQ 团队监控rabbitmq-users
邮件列表,并且只偶尔回答 StackOverflow 上的问题。
你问了几个问题,所以我会尽力回答。我是 Pika 的维护者之一,但不像其他连接适配器那样熟悉 Twisted。
basic_consume不是以在新消息准备就绪时"通知"的方式实现的吗?为什么启动循环调用是我的"工作"?似乎轮询是针对扭曲的事件循环模式,不是吗?
Twisted的LoopingCall
文档指出:
重复调用函数。如果 f 返回延迟,则在触发延迟之前不会进行重新调度。
示例代码使用@defer.inlineCallbacks
和yield
语句返回延迟函数。因此,LoopingCall
不会重复调用该函数,它只会在延迟触发后安排新调用。
这是我期望它的工作方式...从队列中消耗(除非队列中有消息,否则不会立即触发,每次队列中有新消息时都会触发,我现在忽略 qos。
这正是示例代码的工作方式。
如何使用单个消息,例如
basic_get
?我是否需要启动循环呼叫,并在收到消息后停止它?
如果将预取 (QoS) 设置为1
,则 RabbitMQ 将只向消费者发送一条消息,并且在basic_ack
确认第一条消息之前不会发送下一条消息。