![](/img/trans.png)
[英]Azure Function - c# - ServicebusTrigger with Blob binding
[英]Azure Function Python - serviceBusTrigger - How to deadletter a message
我有一个简单的 Python function 如果它不匹配一些约束,它应该死信一条消息。 实际上我提出了一个异常并且一切正常(我的意思是消息是死信的),但我想了解是否有一种“干净”的方式来死信消息而不引发异常。
async def function_handler(message: func.ServiceBusMessage, starter: str):
for msg in [message]:
client = df.DurableOrchestrationClient(starter)
message_body = msg.get_body().decode("utf-8")
msg = json.loads(message_body)
if 'valid' in msg:
instance_id = await client.start_new('orchestrator', None, json.dumps(message_body))
else:
raise Exception(f'not found valid {msg["id"]}')
这是host.json
的一部分,这应该表明我正在使用 Azure 功能的 2.0 版
"extensionBundle": {
"id": "Microsoft.Azure.Functions.ExtensionBundle",
"version": "[2.*, 3.0.0)"
},
欢迎提出建议
在撰写本文时,在 Python 中,无法以交互方式发送死信消息。
我发现autocomplete=false 仅支持 C# 。
这基本上意味着死信消息的唯一方法是引发异常,就像我在代码中所做的那样。
感谢@GauravMantri 为我指出正确的方法(即看看如何使用自动完成配置参数)。
Azure 服务总线队列具有您可以使用的Max Delivery Count
属性。 考虑到您只想只处理一次消息,然后在 Function 无法处理的情况下对消息进行死信,您可以将最大传递计数设置为 1。这样,在第一次传递后,消息将自动死信。
默认情况下,如果在处理消息时没有异常,Function 运行时会尝试自动完成消息。 您不希望 Function 运行时执行此操作。 为此,您需要将auto complete
设置设置为 false。 但是,如果消息处理成功,您会想要删除该消息,因此如果消息处理成功,您将需要手动调用自动完成。
就像是:
if 'valid' in msg:
instance_id = await client.start_new('orchestrator', None, json.dumps(message_body))
//auto complete the message here...
else:
//do nothing and the message will be dead-lettered
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.