Qpid Proton Messenger API 错误处理
我在使用 Qpid Proton AMQP Messenger API 发送消息时遇到了麻烦,特别是在处理错误方面,感觉有点绝望。
下面是一个例子,展示了我在 Python 交互式解释器中发送消息的过程。我试图向一个不存在的队列 myqueue
发送消息,这个队列是在运行在 localhost
的 Qpid 代理上:
>>> from proton import *
>>> mng = Messenger()
>>> mng.timeout = 2000L
>>> m = Message()
>>> m.address = 'amqp://localhost/myqueue'
>>> m.subject = 'Test message'
>>> tracker = mng.put(m)
>>> repr(mng.status(tracker)) # status before send
'None'
>>> ret = mng.send() # send unconditionally returns None
LINK ERROR (amqp:not-found) Node not found: myqueue
>>> repr(mng.status(tracker)) # status after send
'None'
>>> mng.stop()
这里的 LINK ERROR
直接打印到标准输出(stdout)或标准错误(stderr)上,但在这个 API 中并没有任何提示说明消息没有被送达。在发送消息之前,调用 status() 返回 None,当消息在缓冲区中时也是如此;而在消息被丢弃后,调用 status() 依然返回 None。
我是不是漏掉了什么?
我使用的是 Python 2.7 和 Qpid Proton 0.7。
1 个回答
2
最后,我了解到消息发送器的属性 outgoing_window
默认值是0。这个属性表示正在发送的消息数量。把这个值调高就能解决问题:
>>> from proton import *
>>> mng = Messenger()
>>> mng.timeout = 2000L
>>> mng.outgoing_window = 1
>>> m = Message()
>>> m.address = 'amqp://localhost/myqueue'
>>> m.subject = 'Test message'
>>> tracker = mng.put(m)
>>> repr(mng.status(tracker))
'PENDING'
>>> ret = mng.send()
LINK ERROR (amqp:not-found) Node not found: myqueue
>>> repr(mng.status(tracker))
'ABORTED'
>>> mng.stop()
现在我可以跟踪消息的状态,看到它被标记为已中止。