Qpid Proton Messenger API 错误处理

1 投票
1 回答
1428 浏览
提问于 2025-04-18 13:33

我在使用 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()

现在我可以跟踪消息的状态,看到它被标记为已中止

撰写回答