Service Bus Output Bindings
Service Bus output bindings allow your Azure Function to send messages to Azure Service Bus queues or topics. This is a fundamental pattern for enabling asynchronous communication and decoupling different parts of your application.
Key Benefits:
- Decoupling: Your function doesn't need to know about the consuming services.
- Reliability: Service Bus provides robust messaging capabilities.
- Scalability: Easily handle large volumes of messages.
Binding Configuration
Output bindings are configured in your function's function.json file (for JavaScript, Python, etc.) or via attributes in your code (for C#, F#, Java).
function.json Example (JavaScript/TypeScript)
{
"bindings": [
{
"name": "myQueueTrigger",
"type": "queueTrigger",
"direction": "in",
"queueName": "my-input-queue",
"connection": "AzureWebJobsStorage"
},
{
"name": "serviceBusMessage",
"type": "serviceBus",
"direction": "out",
"entityType": "queue",
"queueOrTopicName": "my-output-queue",
"connection": "ServiceBusConnection"
}
],
"scriptFile": "index.js"
}
C# Example (using Attributes)
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host;
using Microsoft.Extensions.Logging;
public static class ServiceBusSender
{
[FunctionName("SendServiceBusMessage")]
public static void Run(
[QueueTrigger("my-input-queue")] string myQueueTriggerItem,
[ServiceBus("my-output-queue", Connection = "ServiceBusConnection")] out string serviceBusMessage,
ILogger log)
{
log.LogInformation($"C# Queue trigger function processed: {myQueueTriggerItem}");
// Create a message to send to Service Bus
serviceBusMessage = $"Processed message: {myQueueTriggerItem.ToUpper()}";
log.LogInformation($"Sending message to Service Bus: {serviceBusMessage}");
}
}
Parameters
name: The name of the output parameter in your function code.type: Set toserviceBus.direction: Must beoutfor output bindings.entityType: Specifies whether you are targeting aqueueor atopic.queueOrTopicName: The name of the queue or topic in Service Bus.connection: The name of the app setting that contains your Service Bus connection string.
Note: For topic subscriptions, you would use
entityType: "topic" and provide the queueOrTopicName as the topic name. You can also specify a subscriptionName for more complex scenarios.
Sending Different Message Types
You can send various types of data by changing the type of your output parameter. For example, to send a JSON object:
JavaScript Example
module.exports = async function (context, myQueueTrigger) {
context.log('JavaScript queue trigger function processed work item', myQueueTrigger);
const messageObject = {
id: Date.now(),
payload: myQueueTrigger.toUpperCase(),
timestamp: new Date().toISOString()
};
// The runtime will automatically serialize JSON objects to strings
context.bindings.serviceBusMessage = JSON.stringify(messageObject);
context.log('Sent message to Service Bus:', messageObject);
};
C# Example
using Microsoft.Azure.WebJobs;
using Microsoft.Extensions.Logging;
using System;
public class ServiceBusMessageModel
{
public int Id { get; set; }
public string Payload { get; set; }
public DateTime Timestamp { get; set; }
}
public static class ServiceBusSenderComplex
{
[FunctionName("SendServiceBusObject")]
public static void Run(
[QueueTrigger("my-input-queue")] string myQueueTriggerItem,
[ServiceBus("my-output-topic", Connection = "ServiceBusConnection")] out ServiceBusMessageModel serviceBusMessage,
ILogger log)
{
log.LogInformation($"C# Queue trigger function processed: {myQueueTriggerItem}");
serviceBusMessage = new ServiceBusMessageModel
{
Id = Guid.NewGuid().GetHashCode(), // Simple way to get an int ID
Payload = $"Data from: {myQueueTriggerItem}",
Timestamp = DateTime.UtcNow
};
log.LogInformation($"Sending object to Service Bus topic.");
}
}
Advanced Scenarios
- Batching: For higher throughput, you can send messages in batches by using an array for your output binding.
- Message Properties: You can set custom message properties using an object that implements
IMessageActions(in some languages) or by explicitly constructing the message object. - Sessions: If your Service Bus queue/topic is session-enabled, you can configure your function to process and send messages within sessions.