Почему циклический вызов требуется при использовании из очереди?
Я пытаюсь потреблять из кроличьих очередей, используя пика и витая:
- Постоянно (новое сообщение -> потреблять)
- Один раз (новое сообщение -> потреблять один раз, не потреблять снова, пока я не скажу)
Единственный вход у меня есть, это пример. Он охватывает вариант использования 1. Как насчет варианта использования 2?
не basic_consume
реализован таким образом, что он будет "уведомлять", когда новое сообщение готово? Почему это моя "работа", чтобы начать цикл? Кажется, что опрос против шаблона цикла событий в витой, нет?
При выполнении запроса http с витой, он отправляет запрос и продолжает выполнение (через отложенные), как только он возвращается. Почему это не работает в RabbitMQ/pika?
Вот как я ожидал, что это сработает:
- подписаться на очередь
- потреблять из очереди (не срабатывает сразу, если в очереди нет сообщения, срабатывает каждый раз, когда в очереди появляется новое сообщение, пока я игнорирую qos.)
Как мне потреблять одно сообщение, например basic_get
? Нужно ли начинать цикл, и как только я получу сообщение, остановим его?
1 ответ
Команда RabbitMQ контролирует rabbitmq-users
список рассылки и только иногда отвечает на вопросы по Stackru.
Вы задаете несколько вопросов, поэтому я постараюсь ответить на них все. Я один из сопровождающих Пики, но я не так знаком с Twisted, как другие адаптеры подключения.
Разве basic_consume не реализован таким образом, чтобы он "уведомлял", когда новое сообщение готово? Почему это моя "работа", чтобы начать цикл? Кажется, что опрос против шаблона цикла событий в витой, нет?
Twisted документация дляLoopingCall
утверждает это:
Вызовите функцию повторно. Если f возвращает отложенное, переназначение не произойдет, пока отложенное не сработает.
Пример кода использует @defer.inlineCallbacks
и yield
оператор для возврата отложенных функций. Так, LoopingCall
не будет вызывать функцию повторно, она будет только планировать новый вызов после того, как отложено срабатывание.
Вот как я могу ожидать, что это будет работать... потреблять из очереди (не срабатывает сразу, если в очереди нет сообщения, будет срабатывать каждый раз, когда в очереди появляется новое сообщение, сейчас я игнорирую qos.)
Именно так работает пример кода.
Как мне потреблять одно сообщение, например
basic_get
? Нужно ли начинать цикл, и как только я получу сообщение, остановим его?
Если вы установите предварительную выборку (QoS) в 1
то RabbitMQ отправит только одно сообщение потребителю и не отправит следующее, пока первое не будет подтверждено basic_ack
,