繁体   English   中英

Azure Function Python - serviceBusTrigger - 如何死信消息

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM