簡體   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