Azure Function Python - serviceBusTrigger - 如何对消息进行死信处理
Azure Function Python - serviceBusTrigger - How to deadletter a message
我有一个简单的 Python 函数,如果它不匹配少数约束,它应该将消息设为死信。实际上我提出了一个例外并且一切正常(我的意思是消息被死信),但我想了解是否有一种“干净”的方式来死信消息而不引发异常。
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 Functions 的 2.0 版
"extensionBundle": {
"id": "Microsoft.Azure.Functions.ExtensionBundle",
"version": "[2.*, 3.0.0)"
},
欢迎提出建议
Azure 服务总线队列有这个 Max Delivery Count
属性 您可以利用。考虑到您只想处理一条消息一次,然后在 Function 无法处理的情况下对该消息进行死信处理,您可以将最大传递计数设置为 1。这样,该消息将在第一次传递后自动变为死信。
默认情况下,如果在处理消息时没有异常,函数运行时会尝试自动完成消息。您不希望函数运行时执行此操作。为此,您需要做的是将 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
在撰写本文时,在 Python 中,无法 以死信方式交互发送消息。
我发现 autocomplete=false is only supported for C#。
这基本上意味着使消息成为死信的唯一方法是引发异常,就像我在代码中所做的那样。
感谢@GauravMantri 为我指出了正确的方法(即看看如何使用自动完成配置参数)。
我有一个简单的 Python 函数,如果它不匹配少数约束,它应该将消息设为死信。实际上我提出了一个例外并且一切正常(我的意思是消息被死信),但我想了解是否有一种“干净”的方式来死信消息而不引发异常。
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 Functions 的 2.0 版
"extensionBundle": {
"id": "Microsoft.Azure.Functions.ExtensionBundle",
"version": "[2.*, 3.0.0)"
},
欢迎提出建议
Azure 服务总线队列有这个 Max Delivery Count
属性 您可以利用。考虑到您只想处理一条消息一次,然后在 Function 无法处理的情况下对该消息进行死信处理,您可以将最大传递计数设置为 1。这样,该消息将在第一次传递后自动变为死信。
默认情况下,如果在处理消息时没有异常,函数运行时会尝试自动完成消息。您不希望函数运行时执行此操作。为此,您需要做的是将 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
在撰写本文时,在 Python 中,无法 以死信方式交互发送消息。
我发现 autocomplete=false is only supported for C#。
这基本上意味着使消息成为死信的唯一方法是引发异常,就像我在代码中所做的那样。
感谢@GauravMantri 为我指出了正确的方法(即看看如何使用自动完成配置参数)。