Потребитель Python Kombu не уведомлен о сообщении rabbitmq (queue.get работает) - PullRequest
4 голосов
/ 08 марта 2011

Если я запускаю следующий код, обратный вызов (тест), переданный потребителю , никогда не запускается.

Однако, если я буду следить за графическим интерфейсом rabbitmq, я вижу, что сообщение получено (но не подтверждено). Таким образом, кажется, что потребитель получает сообщение, но не передает его моему обратному вызову. Если установить для no_ack значение true, сообщение просто исчезнет из очереди, опять же без обратного вызова.

hn = "..."
usr = "..."
pwd = "..."
vh = "/"
port = 5672
rkey = "some.routing.key"
qname = "some-queue-name"
exchangeName = "MyExchange"

connection = BrokerConnection(hostname=hn,
                              userid=usr,
                              password=pwd,
                              virtual_host=vh,
                              port=port)

connection.connect()
ch = connection.channel()

# Create & the exchange
exchange = Exchange(name=exchangeName,
              type="topic",
              channel=ch,
              durable=True)

exchange.declare()

# Temporary channel
ch = connection.channel()

# Create the queue to feed from
balq = Queue(name=qname,
              exchange=exchange,
              durable=True,
              auto_delete=False,
              channel=ch,
              routing_key=rkey)        

# Declare it on the server
balq.declare();

def test(b,m):
    print '** Message Arrived **'

# Create a consumer
consumer = Consumer(channel=connection.channel(),
                    queues=balq,
                    auto_declare=False,
                    callbacks = [test]
                    )

# register it on the server
consumer.consume(no_ack=False);

print 'Waiting for messages'
while(True):
    pass

Однако следующий код работает правильно (я могу успешно получить и подтвердить сообщение):

m = balq.get(no_ack=False)
m.ack()
print m

Но все дело в том, чтобы оставаться асинхронным. Так что, должно быть, что-то не так с моим обратным вызовом ..

1 Ответ

5 голосов
/ 10 марта 2011

Оказывается, это простая ошибка.Добавление

connection.drain_events()

в цикл while приводит к получению сообщений.

...