Azure Functions 的 Azure 服務匯流排觸發程序

使用 服務匯流排 觸發程式來回應來自 服務匯流排 佇列或主題的訊息。 從擴充功能 3.1.0 版開始,您可以在已啟用會話的佇列或主題上觸發。

如需安裝和組態詳細數據的詳細資訊,請參閱概

服務匯流排 取用和 進階版 方案的調整決策是根據以目標為基礎的調整來進行。 如需詳細資訊,請參閱 以目標為基礎的調整

重要

本文使用索引標籤來支援多個版本的Node.js程序設計模型。 v4 模型已正式推出,旨在為 JavaScript 和 TypeScript 開發人員提供更靈活的直覺式體驗。 如需 v4 模型運作方式的詳細資訊,請參閱 Azure Functions Node.js開發人員指南。 若要深入瞭解 v3 與 v4 之間的差異,請參閱 移轉指南

Azure Functions 支援兩種適用於 Python 的程式設計模型。 您定義系結的方式取決於您所選擇的程式設計模型。

Python v2 程式設計模型可讓您直接在 Python 函式程式代碼中使用裝飾項目來定義系結。 如需詳細資訊,請參閱 Python 開發人員指南

本文支援這兩種程序設計模型。

範例

您可以使用下列其中一種 C# 模式來建立 C# 函式:

  • 隔離的背景工作模型:在與運行時間隔離的背景工作進程中執行的已編譯 C# 函式。 需要隔離的背景工作進程,才能支援在 LTS 和非 LTS 版本 .NET 和 .NET Framework 上執行的 C# 函式。 隔離背景工作進程函式的延伸模組會使用 Microsoft.Azure.Functions.Worker.Extensions.* 命名空間。
  • 同進程模型:在與 Functions 運行時間相同的進程中執行的已編譯 C# 函式。 在此模型的變化中,函式可以使用 C# 腳本來執行,主要支援 C# 入口網站編輯。 進程內函式的延伸模組會使用 Microsoft.Azure.WebJobs.Extensions.* 命名空間。

重要

支援將於 2026 年 11 月 10 日結束進程模型。 強烈建議您將 應用程式移轉至隔離的背景工作模型 ,以取得完整支援。

此程式代碼會定義並初始化 ILogger

private readonly ILogger<ServiceBusReceivedMessageFunctions> _logger;

public ServiceBusReceivedMessageFunctions(ILogger<ServiceBusReceivedMessageFunctions> logger)
{
    _logger = logger;
}

此範例顯示 C# 函式,該函式會接收單一 服務匯流排 佇列訊息,並將它寫入記錄:

[Function(nameof(ServiceBusReceivedMessageFunction))]
[ServiceBusOutput("outputQueue", Connection = "ServiceBusConnection")]
public string ServiceBusReceivedMessageFunction(
    [ServiceBusTrigger("queue", Connection = "ServiceBusConnection")] ServiceBusReceivedMessage message)
{
    _logger.LogInformation("Message ID: {id}", message.MessageId);
    _logger.LogInformation("Message Body: {body}", message.Body);
    _logger.LogInformation("Message Content-Type: {contentType}", message.ContentType);

    var outputMessage = $"Output message created at {DateTime.Now}";
    return outputMessage;
}

此範例顯示 C# 函式,會在單一批次中接收多個 服務匯流排 佇列訊息,並將每個訊息寫入記錄:

[Function(nameof(ServiceBusReceivedMessageBatchFunction))]
public void ServiceBusReceivedMessageBatchFunction(
    [ServiceBusTrigger("queue", Connection = "ServiceBusConnection", IsBatched = true)] ServiceBusReceivedMessage[] messages)
{
    foreach (ServiceBusReceivedMessage message in messages)
    {
        _logger.LogInformation("Message ID: {id}", message.MessageId);
        _logger.LogInformation("Message Body: {body}", message.Body);
        _logger.LogInformation("Message Content-Type: {contentType}", message.ContentType);
    }
}

此範例顯示 C# 函式,該函式會接收多個 服務匯流排 佇列訊息、將它寫入記錄中,然後將訊息確定為已完成:

[Function(nameof(ServiceBusMessageActionsFunction))]
public async Task ServiceBusMessageActionsFunction(
    [ServiceBusTrigger("queue", Connection = "ServiceBusConnection", AutoCompleteMessages = false)]
    ServiceBusReceivedMessage message,
    ServiceBusMessageActions messageActions)
{
    _logger.LogInformation("Message ID: {id}", message.MessageId);
    _logger.LogInformation("Message Body: {body}", message.Body);
    _logger.LogInformation("Message Content-Type: {contentType}", message.ContentType);

    // Complete the message
    await messageActions.CompleteMessageAsync(message);
}

下列 Java 函式會使用 @ServiceBusQueueTrigger Java 函式運行時間連結庫中註釋來描述 服務匯流排 佇列觸發程式的組態。 函式會擷取放在佇列上的訊息,並將它新增至記錄。

@FunctionName("sbprocessor")
 public void serviceBusProcess(
    @ServiceBusQueueTrigger(name = "msg",
                             queueName = "myqueuename",
                             connection = "myconnvarname") String message,
   final ExecutionContext context
 ) {
     context.getLogger().info(message);
 }

當訊息新增至 服務匯流排 主題時,也可以觸發Java函式。 下列範例會 @ServiceBusTopicTrigger 使用 註釋來描述觸發程式組態。

@FunctionName("sbtopicprocessor")
    public void run(
        @ServiceBusTopicTrigger(
            name = "message",
            topicName = "mytopicname",
            subscriptionName = "mysubscription",
            connection = "ServiceBusConnection"
        ) String message,
        final ExecutionContext context
    ) {
        context.getLogger().info(message);
    }

下列範例顯示 服務匯流排 觸發程式 TypeScript 函式。 函式會讀取訊息元數據,並記錄 服務匯流排 佇列訊息。

import { app, InvocationContext } from '@azure/functions';

export async function serviceBusQueueTrigger1(message: unknown, context: InvocationContext): Promise<void> {
    context.log('Service bus queue function processed message:', message);
    context.log('EnqueuedTimeUtc =', context.triggerMetadata.enqueuedTimeUtc);
    context.log('DeliveryCount =', context.triggerMetadata.deliveryCount);
    context.log('MessageId =', context.triggerMetadata.messageId);
}

app.serviceBusQueue('serviceBusQueueTrigger1', {
    connection: 'MyServiceBusConnection',
    queueName: 'testqueue',
    handler: serviceBusQueueTrigger1,
});

下列範例顯示 服務匯流排 觸發 JavaScript 函式。 函式會讀取訊息元數據,並記錄 服務匯流排 佇列訊息。

const { app } = require('@azure/functions');

app.serviceBusQueue('serviceBusQueueTrigger1', {
    connection: 'MyServiceBusConnection',
    queueName: 'testqueue',
    handler: (message, context) => {
        context.log('Service bus queue function processed message:', message);
        context.log('EnqueuedTimeUtc =', context.triggerMetadata.enqueuedTimeUtc);
        context.log('DeliveryCount =', context.triggerMetadata.deliveryCount);
        context.log('MessageId =', context.triggerMetadata.messageId);
    },
});

下列範例顯示function.json檔案中的 服務匯流排 觸發程式系結,以及使用系結的 PowerShell 函式。

以下是 function.json 檔案中的繫結資料:

{
  "bindings": [
    {
      "name": "mySbMsg",
      "type": "serviceBusTrigger",
      "direction": "in",
      "topicName": "mytopic",
      "subscriptionName": "mysubscription",
      "connection": "AzureServiceBusConnectionString"
    }
  ]
}

以下是傳送 服務匯流排 訊息時所執行的函式。

param([string] $mySbMsg, $TriggerMetadata)

Write-Host "PowerShell ServiceBus queue trigger function processed message: $mySbMsg"

下列範例示範如何透過觸發程式讀取 服務匯流排 佇列訊息。 此範例取決於您使用的是 v1 或 v2 Python 程式設計模型

import logging
import azure.functions as func

app = func.FunctionApp()

@app.function_name(name="ServiceBusQueueTrigger1")
@app.service_bus_queue_trigger(arg_name="msg", 
                               queue_name="<QUEUE_NAME>", 
                               connection="<CONNECTION_SETTING>")
def test_function(msg: func.ServiceBusMessage):
    logging.info('Python ServiceBus queue trigger processed message: %s',
                 msg.get_body().decode('utf-8'))

下列範例示範如何透過觸發程式讀取 服務匯流排 佇列主題。

import logging
import azure.functions as func

app = func.FunctionApp()

@app.function_name(name="ServiceBusTopicTrigger1")
@app.service_bus_topic_trigger(arg_name="message", 
                               topic_name="TOPIC_NAME", 
                               connection="CONNECTION_SETTING", 
                               subscription_name="SUBSCRIPTION_NAME")
def test_function(message: func.ServiceBusMessage):
    message_body = message.get_body().decode("utf-8")
    logging.info("Python ServiceBus topic trigger processed message.")
    logging.info("Message Body: " + message_body)

屬性

進程內隔離的背景工作進程 C# 連結庫都會使用 ServiceBusTriggerAttribute 屬性來定義函式觸發程式。 C# 文稿會改用function.json組態檔,如 C# 腳本指南中所述

下表說明您可以使用這個觸發程式屬性來設定的屬性:

屬性 說明
QueueName 要監視的佇列名稱。 只有在監視佇列時設定 (不適用於主題)。
TopicName 要監視的主題名稱。 只有在監視主題時設定 (不適用於佇列)。
SubscriptionName 要監視的訂用帳戶名稱。 只有在監視主題時設定 (不適用於佇列)。
[連接] 指定如何連線到服務匯流排的應用程式設定或設定集合名稱。 請參閱連線
IsBatched 訊息會以批次方式傳遞。 需要數位或集合類型。
IsSessionsEnabled 如果連接到工作階段感知佇列或訂用帳戶,則為 true。 否則為 false,其為預設值。
AutoCompleteMessages true 如果觸發程式應該在成功叫用之後自動完成訊息,則為 。 false 如果不應該,則為 ,例如當您 在程式代碼中處理訊息結算時。 如果未明確設定,行為會以 中的host.jsonautoCompleteMessages態為基礎。

當您在本機開發時,請在集合中的 local.settings.json 檔案Values中新增應用程式設定。

裝飾項目

僅適用於 Python v2 程式設計模型。

針對使用裝飾項目定義的 Python v2 函式,在上 service_bus_queue_trigger具有下列屬性:

屬性 說明
arg_name 代表函式程式碼中佇列或主題訊息的變數名稱。
queue_name 要監視的佇列名稱。 只有在監視佇列時設定 (不適用於主題)。
connection 指定如何連線到服務匯流排的應用程式設定或設定集合名稱。 請參閱連線

如需使用 function.json 定義的 Python 函式,請參閱組 一節。

註釋

ServiceBusQueueTrigger注可讓您建立函式,以在建立 服務匯流排 佇列訊息時執行。 可用的群組態選項包括下列屬性:

屬性 描述
name 代表函式程式碼中佇列或主題訊息的變數名稱。
queueName 要監視的佇列名稱。 只有在監視佇列時設定 (不適用於主題)。
topicName 要監視的主題名稱。 只有在監視主題時設定 (不適用於佇列)。
subscriptionName 要監視的訂用帳戶名稱。 只有在監視主題時設定 (不適用於佇列)。
connection 指定如何連線到服務匯流排的應用程式設定或設定集合名稱。 請參閱連線

ServiceBusTopicTrigger 注可讓您指定主題和訂用帳戶,以鎖定哪些數據觸發函式。

當您在本機開發時,請在集合中的 local.settings.json 檔案Values中新增應用程式設定。

如需詳細資訊,請參閱觸發程式 範例

組態

僅適用於 Python v1 程式設計模型。

下表說明您可以在傳遞至 app.serviceBusQueue()app.serviceBusTopic() 方法的物件上options設定的屬性。

屬性 說明
queueName 要監視的佇列名稱。 只有在監視佇列時設定 (不適用於主題)。
topicName 要監視的主題名稱。 只有在監視主題時設定 (不適用於佇列)。
subscriptionName 要監視的訂用帳戶名稱。 只有在監視主題時設定 (不適用於佇列)。
connection 指定如何連線到服務匯流排的應用程式設定或設定集合名稱。 請參閱連線
accessRights 連接字串的存取權限。 可用值為 managelisten。 預設值是 manage,這表示 connection 已具備管理權限。 如果您使用沒有管理權限的連接字串,請將 accessRights 設定為 "listen"。 否則,Functions 執行階段在嘗試執行需要管理權限的作業時可能會失敗。 在 Azure Functions 版本 2.x 及以上版本中,無法使用此屬性,因為最新版的服務匯流排 SDK 不支援管理作業。
isSessionsEnabled 如果連接到工作階段感知佇列或訂用帳戶,則為 true。 否則為 false,其為預設值。
autoComplete 必須是 true 非 C# 函式,這表示觸發程式應該在處理之後自動呼叫完成,或函式程式代碼手動呼叫完成。

當設定為 true時,觸發程式會在函式執行順利完成時自動完成訊息,否則會放棄訊息。

函式中的例外狀況會導致背景中的運行時間呼叫 abandonAsync 。 如果沒有發生例外狀況,則會 completeAsync 在背景中呼叫 。 此屬性僅適用於 Azure Functions 2.x 和更新版本。

當您在本機開發時,請在集合中的 local.settings.json 檔案Values中新增應用程式設定。

下表說明您在 function.json 檔案中設定的繫結設定屬性。

function.json 屬性 描述
type 必須設定為 serviceBusTrigger。 當您在 Azure 入口網站中建立觸發程序時,會自動設定此屬性。
direction 必須設定為 「in」。 當您在 Azure 入口網站中建立觸發程序時,會自動設定此屬性。
name 代表函式程式碼中佇列或主題訊息的變數名稱。
queueName 要監視的佇列名稱。 只有在監視佇列時設定 (不適用於主題)。
topicName 要監視的主題名稱。 只有在監視主題時設定 (不適用於佇列)。
subscriptionName 要監視的訂用帳戶名稱。 只有在監視主題時設定 (不適用於佇列)。
connection 指定如何連線到服務匯流排的應用程式設定或設定集合名稱。 請參閱連線
accessRights 連接字串的存取權限。 可用值為 managelisten。 預設值是 manage,這表示 connection 已具備管理權限。 如果您使用沒有管理權限的連接字串,請將 accessRights 設定為 "listen"。 否則,Functions 執行階段在嘗試執行需要管理權限的作業時可能會失敗。 在 Azure Functions 版本 2.x 及以上版本中,無法使用此屬性,因為最新版的服務匯流排 SDK 不支援管理作業。
isSessionsEnabled 如果連接到工作階段感知佇列或訂用帳戶,則為 true。 否則為 false,其為預設值。
autoComplete 必須是 true 非 C# 函式,這表示觸發程式應該在處理之後自動呼叫完成,或函式程式代碼手動呼叫完成。

當設定為 true時,觸發程式會在函式執行順利完成時自動完成訊息,否則會放棄訊息。

函式中的例外狀況會導致背景中的運行時間呼叫 abandonAsync 。 如果沒有發生例外狀況,則會 completeAsync 在背景中呼叫 。 此屬性僅適用於 Azure Functions 2.x 和更新版本。

當您在本機開發時,請在集合中的 local.settings.json 檔案Values中新增應用程式設定。

如需完整範例, 請參閱範例一節

使用方式

所有 C# 形式和延伸模組版本都支援下列參數類型:

類型 描述
System.String 當訊息為簡單文字時,請使用 。
byte[] 用於二進位數據訊息。
Object 當訊息包含 JSON 時,Functions 會嘗試將 JSON 數據還原串行化為已知的純舊 CLR 物件類型。

傳訊特定參數類型包含其他訊息元數據。 服務匯流排 觸發程式支援的特定類型取決於 Functions 執行時間版本、擴充套件版本,以及所使用的 C# 形式。

當您想要讓函式處理單一訊息時,服務匯流排 觸發程式可以繫結至下列類型:

類型 描述
string 以字串表示的訊息。 當訊息為簡單文字時,請使用 。
byte[] 訊息的位元組。
JSON 可序列化型別 當事件包含 JSON 數據時,Functions 會嘗試將 JSON 數據還原串行化為一般舊的 CLR 物件 (POCO) 類型。
ServiceBusReceivedMessage1 訊息物件。

系結至 ServiceBusReceivedMessage時,您也可以選擇性地包含 ServiceBusMessageActions1,2 類型的參數來執行訊息結算動作。

當您想要讓函式處理一批訊息時,服務匯流排 觸發程式可以繫結至下列類型:

類型 描述
T[] 其中 T 是其中一種單一訊息類型 來自批次的事件陣列。 每個專案都代表一個事件。

系結至 ServiceBusReceivedMessage[]時,您也可以選擇性地包含 ServiceBusMessageActions1,2 類型的參數來執行訊息結算動作。

1 若要使用這些類型,您必須參考 Microsoft.Azure.Functions.Worker.Extensions.ServiceBus 5.14.1 或更新版本 ,以及 SDK 類型系結的通用相依性。

2 使用 ServiceBusMessageActions時,將觸發程式屬性的 屬性設定AutoCompleteMessagesfalse。 這可防止運行時間在成功函式調用之後嘗試完成訊息。

Connection未定義 屬性時,Functions 會尋找名為 AzureWebJobsServiceBus的應用程式設定,這是 服務匯流排 連接字串的預設名稱。 您也可以設定 Connection 屬性,以指定要使用之 服務匯流排 連接字串 的應用程式設定名稱。

傳入 服務匯流排 訊息可透過 ServiceBusQueueMessageServiceBusTopicMessage 參數取得。

存取佇列或主題訊息作為函式的第一個自變數。 服務匯流排 訊息會以字串或 JSON 物件的形式傳遞至 函式。

服務匯流排 實例可透過function.json檔案名稱屬性中設定的參數來取得。

佇列訊息可透過類型為 func.ServiceBusMessage的參數提供給函式。 服務匯流排 訊息會以字串或 JSON 物件的形式傳遞至 函式。

如需完整的範例,請參閱 範例一節

連線

屬性connection是環境組態的參考,指定應用程式應該如何連線到 服務匯流排。 它可以指定:

如果設定的值既與單一設定完全相符,又是其他設定的前置詞比對,則會使用完全相符專案。

連接字串

若要取得 連接字串,請遵循取得管理認證中所述的步驟。 連接字串 必須是 服務匯流排 命名空間,不限於特定佇列或主題。

此 連接字串 應該儲存在應用程式設定中,其名稱符合系結組態的 屬性所connection指定的值。

如果應用程式設定名稱以 「AzureWebJobs」 開頭,則您只能指定名稱的其餘部分。 例如,如果您設定 connection 為 「MyServiceBus」,Functions 運行時間會尋找名為 “AzureWebJobsMyServiceBus” 的應用程式設定。 如果您保留connection空白,Functions 運行時間會在名為 “AzureWebJobsServiceBus” 的應用程式設定中使用預設 服務匯流排 連接字串。

身分識別型連線

如果您使用 5.x 版或更高版本的延伸模組,而不是使用具有秘密的 連接字串,您可以讓應用程式使用 Microsoft Entra 身分識別。 若要這樣做,您會在通用前置詞下定義設定,以對應至 connection 觸發程式和系結組態中的 屬性。

在此模式中,延伸模組需要下列屬性:

屬性 環境變數範本 描述 範例值
完整命名空間 <CONNECTION_NAME_PREFIX>__fullyQualifiedNamespace 完整 服務匯流排 命名空間。 <>service_bus_namespace.servicebus.windows.net

其他屬性可以設定為自定義連線。 請參閱 身分識別型連線的一般屬性。

注意

使用 Azure 應用程式組態Key Vault 來提供「受控識別」連線的設定時,設定名稱應使用有效的索引鍵分隔符號,例如::/ 取代 __,以確保正確解析名稱。

例如: <CONNECTION_NAME_PREFIX>:fullyQualifiedNamespace

主控於 Azure Functions 服務時,以身分識別為基礎的連接會使用受控識別。 雖然可以使用 credentialclientID 屬性指定使用者指派的身分識別,但預設會使用系統指派的身分識別。 請注意,不支援使用資源標識符設定使用者指派的身分識別。 在其他內容中執行時,例如本機開發,會改用您的開發人員身分識別,但您可以自定義此身分識別。 請參閱 使用身分識別型連線進行本機開發。

授與權限給身分識別

正在使用的任何身分識別,都必須具有執行預期動作的權限。 對於大部分的 Azure 服務,這表示您必須 使用內建或自定義角色,在 Azure RBAC 中指派角色,以提供這些許可權。

重要

部分權限可能會由所有內容都不需要的目標服務公開。 可以的話,請遵循最低權限原則,只授與身分識別所需的權限。 例如,如果應用程式只需要能夠從數據源讀取,請使用只有讀取許可權的角色。 指派也允許寫入該服務的角色是不適當的,因為這會是讀取作業的過度許可權。 同樣地,您會想要確保角色指派的範圍僅限於需要讀取的資源。

您必須建立角色指派,以在運行時間存取您的主題和佇列。 擁有者之類的管理角色是不夠的。 下表顯示正常作業中使用 服務匯流排 擴充功能時建議的內建角色。 您的應用程式可能需要根據您撰寫的程式代碼來取得其他許可權。

繫結類型 範例內建角色
觸發程式1 Azure 服務匯流排 數據接收器Azure 服務匯流排 數據擁有者
輸出繫結 Azure 服務匯流排資料傳送者

1 若要從 服務匯流排 主題觸發,角色指派必須具有 服務匯流排 訂用帳戶資源的有效範圍。 如果只包含主題,則會發生錯誤。 Azure 入口網站等部分用戶端不會將服務匯流排訂用帳戶資源公開為角色指派的範圍。 在這種情況下,可能會改用 Azure CLI。 若要深入瞭解,請參閱適用於 Azure 服務匯流排 的 Azure 內建角色。

有害訊息

無法在 Azure Functions 中控制或設定有害訊息處理。 服務匯流排處理有害訊息本身。

PeekLock 行為

Functions 運行時間會以 PeekLock 模式接收訊息。

根據預設,如果函式順利完成,則運行時間會在訊息上呼叫 Complete ,如果函式失敗,則會呼叫 Abandon 。 您可以使用中的host.json屬性停用自動完成autoCompleteMessages

根據預設,如果函式順利完成,則運行時間會在訊息上呼叫 Complete ,如果函式失敗,則會呼叫 Abandon 。 您可以使用中的 host.json 屬性,或透過觸發程式屬性上的 屬性停用自動完成autoCompleteMessages。 如果您的函式程式碼處理訊息結算,您應該停用自動完成。

如果函式執行的時間超過 PeekLock 逾時,只要函式正在執行,就會自動更新鎖定。 maxAutoRenewDuration可在 host.json設定,其對應至 ServiceBusProcessor.MaxAutoLockRenewalDuration。 此設定的預設值為 5 分鐘。

訊息元數據

傳訊特定類型可讓您輕鬆地擷取 元數據做為 對象的屬性。 這些屬性取決於 Functions 運行時間版本、擴充套件版本,以及所使用的 C# 形式。

這些屬性是 ServiceBusReceivedMessage 類別的成員

屬性 類型​ 描述
ApplicationProperties ApplicationProperties 傳送者所設定的屬性。
ContentType string 傳送者和接收者用於應用程式特定邏輯的內容類型標識碼。
CorrelationId string 相互關聯標識碼。
DeliveryCount Int32 交付次數。
EnqueuedTime DateTime UTC 加入佇列的時間。
ScheduledEnqueueTimeUtc DateTime 以UTC排程加入佇列的時間。
ExpiresAt DateTime UTC 的到期時間。
MessageId string 用戶定義值,如果啟用,服務匯流排 可用來識別重複的訊息。
ReplyTo string 佇列位址的回復。
Subject string 應用程式特定的標籤,可用來取代 Label 元資料屬性。
To string 傳送至位址。

下一步