Introduction to Service Bus Output Bindings

Output bindings for Azure Service Bus in Azure Functions provide a straightforward way to send messages from your function code to Azure Service Bus queues or topics. This integration simplifies common integration scenarios, allowing your functions to act as producers for messaging systems without requiring explicit SDK calls for sending messages.

By leveraging output bindings, you can:

Core Concepts

The Service Bus output binding is configured in your function's function.json file or via attributes in your programming language. You specify the target queue or topic, and the binding handles the underlying communication with the Service Bus service.

When to Use Service Bus Output Bindings

These bindings are ideal for scenarios where your Azure Function needs to:

Configuring the Service Bus Output Binding

The configuration depends on how you define your Azure Functions (e.g., using function.json or language-specific attributes).

Using function.json

For a queue output binding, your function.json might look like this:

function.json

{
  "scriptFile": "__init__.py",
  "bindings": [
    {
      "name": "req",
      "type": "httpTrigger",
      "direction": "in",
      "methods": [
        "get",
        "post"
      ],
      "authLevel": "function"
    },
    {
      "name": "message",
      "type": "serviceBus",
      "direction": "out",
      "queueName": "myoutputqueue",
      "connection": "ServiceBusConnection"
    },
    {
      "name": "$return",
      "type": "http",
      "direction": "out"
    }
  ]
}

And for a topic output binding:

function.json

{
  "scriptFile": "index.js",
  "bindings": [
    {
      "name": "myQueueItem",
      "type": "queueTrigger",
      "direction": "in",
      "queueName": "myqueue",
      "connection": "AzureWebJobsStorage"
    },
    {
      "name": "outputSbQueue",
      "type": "serviceBus",
      "direction": "out",
      "topicName": "mytopic",
      "queueName": "mysubscription",
      "connection": "ServiceBusConnection"
    }
  ]
}

Using Attributes (C# Example)

In C#, you would typically use attributes:

C# Function

using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Azure.WebJobs.Host;
using Microsoft.WindowsAzure.Storage.Blob;
using System.Net.Http;
using System.Threading.Tasks;

public static class ServiceBusOutputExample
{
    [FunctionName("SendToServiceBusQueue")]
    public static async Task Run(
        [HttpTrigger(AuthorizationLevel.Function, "post")] HttpRequestMessage req,
        [ServiceBus("myoutputqueue", Connection = "ServiceBusConnection")] out string outputSbMessage,
        TraceWriter log)
    {
        string requestBody = await req.Content.ReadAsStringAsync();
        outputSbMessage = requestBody;
        log.Info($"C# ServiceBus output binding function processed request and sent message: {outputSbMessage}");
    }
}

Sending Messages

Once configured, you assign data to the output binding object within your function code. The runtime then automatically sends this data as a message to the configured Service Bus destination.

Sending a Single Message

In JavaScript, you can assign a string or a JSON object directly to the output binding variable:

JavaScript Function

module.exports = async function (context, req) {
    const messageToSend = context.req.body || "Hello from Azure Functions!";

    // Assign the message to the output binding
    context.bindings.message = messageToSend;

    context.res = {
        status: 200,
        body: "Message sent to Service Bus."
    };
};

Sending Multiple Messages

You can send multiple messages by assigning an array of messages to the output binding. This is a highly efficient way to batch messages.

Python Function

import logging
import azure.functions as func

def main(req: func.HttpRequest, outputSbMessages: func.Out[list]) -> func.HttpResponse:
    logging.info('Python HTTP trigger function processed a request.')

    messages = [
        "Message 1",
        "Message 2",
        {"id": 3, "content": "This is a JSON message"}
    ]

    outputSbMessages.set(messages)

    return func.HttpResponse(
         "Multiple messages sent to Service Bus.",
         status_code=200
    )

Advanced Scenarios

Customizing Message Properties

While the basic binding sends messages with default properties, you can often customize them by sending a complex object (e.g., a dictionary in Python or an object in JavaScript) that represents the Service Bus message structure. For example, setting a message label or content type.

The exact structure for custom properties can vary slightly by language and binding version, but typically involves an object with properties like body, contentType, label, etc.

Sending to Topics

The configuration for sending to a topic is very similar to sending to a queue. You'll specify topicName instead of queueName in your binding configuration.

Error Handling

Standard error handling within your function code applies. If the Service Bus service is unavailable or rejects the message, the binding will typically throw an exception that your function should catch and handle gracefully.