Skip to content

Commit 22eae0d

Browse files
authored
Support Service Bus resources in Azure Functions (#5593)
1 parent d8caaec commit 22eae0d

File tree

9 files changed

+51
-2
lines changed

9 files changed

+51
-2
lines changed

Directory.Packages.props

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,7 @@
172172
<PackageVersion Include="Microsoft.Azure.Functions.Worker.Extensions.Http.AspNetCore" Version="1.3.2" />
173173
<PackageVersion Include="Microsoft.Azure.Functions.Worker.Extensions.Storage.Blobs" Version="6.6.0" />
174174
<PackageVersion Include="Microsoft.Azure.Functions.Worker.Extensions.Storage.Queues" Version="5.5.0" />
175+
<PackageVersion Include="Microsoft.Azure.Functions.Worker.Extensions.ServiceBus" Version="5.22.0" />
175176
<PackageVersion Include="Microsoft.Azure.Functions.Worker.Extensions.EventHubs" Version="6.3.5"/>
176177
<PackageVersion Include="Microsoft.Azure.Functions.Worker.OpenTelemetry" Version="1.0.0-preview1" />
177178
<PackageVersion Include="Microsoft.Azure.Functions.Worker.Sdk" Version="1.17.4" />

playground/AzureFunctionsEndToEnd/AzureFunctionsEndToEnd.ApiService/AzureFunctionsEndToEnd.ApiService.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
<AspireProjectOrPackageReference Include="Aspire.Azure.Storage.Blobs" />
1515
<AspireProjectOrPackageReference Include="Aspire.Azure.Storage.Queues" />
1616
<AspireProjectOrPackageReference Include="Aspire.Azure.Messaging.EventHubs" />
17+
<AspireProjectOrPackageReference Include="Aspire.Azure.Messaging.ServiceBus" />
1718
</ItemGroup>
1819

1920
</Project>

playground/AzureFunctionsEndToEnd/AzureFunctionsEndToEnd.ApiService/Program.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#if !SKIP_EVENTHUBS_EMULATION
44
using Azure.Messaging.EventHubs;
55
using Azure.Messaging.EventHubs.Producer;
6+
using Azure.Messaging.ServiceBus;
67
#endif
78
using Azure.Storage.Blobs;
89
using Azure.Storage.Queues;
@@ -15,6 +16,7 @@
1516
builder.AddAzureBlobClient("blob");
1617
#if !SKIP_EVENTHUBS_EMULATION
1718
builder.AddAzureEventHubProducerClient("eventhubs", static settings => settings.EventHubName = "myhub");
19+
builder.AddAzureServiceBusClient("messaging");
1820
#endif
1921

2022
var app = builder.Build();
@@ -54,6 +56,13 @@ static string RandomString(int length)
5456
await client.SendAsync([new EventData(data)]);
5557
return Results.Ok("Message sent to Azure EventHubs.");
5658
});
59+
app.MapGet("/publish/asb", async (ServiceBusClient client, CancellationToken cancellationToken, int length = 20) =>
60+
{
61+
var sender = client.CreateSender("myqueue");
62+
var message = new ServiceBusMessage(Encoding.UTF8.GetBytes(RandomString(length)));
63+
await sender.SendMessageAsync(message, cancellationToken);
64+
return Results.Ok("Message sent to Azure Service Bus.");
65+
});
5766
#endif
5867

5968
app.MapGet("/", async (HttpClient client) =>

playground/AzureFunctionsEndToEnd/AzureFunctionsEndToEnd.AppHost/AzureFunctionsEndToEnd.AppHost.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
<AspireProjectOrPackageReference Include="Aspire.Hosting.Azure.Functions" />
1414
<AspireProjectOrPackageReference Include="Aspire.Hosting.Azure.EventHubs" />
1515
<AspireProjectOrPackageReference Include="Aspire.Hosting.Azure.Storage" />
16+
<AspireProjectOrPackageReference Include="Aspire.Hosting.Azure.ServiceBus" />
1617
<AspireProjectOrPackageReference Include="Aspire.Hosting.AppHost" />
1718
</ItemGroup>
1819

playground/AzureFunctionsEndToEnd/AzureFunctionsEndToEnd.AppHost/Program.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,22 @@
88

99
#if !SKIP_EVENTHUBS_EMULATION
1010
var eventHubs = builder.AddAzureEventHubs("eventhubs").RunAsEmulator().AddEventHub("myhub");
11+
var serviceBus = builder.AddAzureServiceBus("messaging").AddQueue("myqueue");
1112
#endif
1213

1314
var funcApp = builder.AddAzureFunctionsProject<Projects.AzureFunctionsEndToEnd_Functions>("funcapp")
1415
.WithExternalHttpEndpoints()
1516
#if !SKIP_EVENTHUBS_EMULATION
1617
.WithReference(eventHubs)
18+
.WithReference(serviceBus)
1719
#endif
1820
.WithReference(blob)
1921
.WithReference(queue);
2022

2123
builder.AddProject<Projects.AzureFunctionsEndToEnd_ApiService>("apiservice")
2224
#if !SKIP_EVENTHUBS_EMULATION
2325
.WithReference(eventHubs)
26+
.WithReference(serviceBus)
2427
#endif
2528
.WithReference(queue)
2629
.WithReference(blob)

playground/AzureFunctionsEndToEnd/AzureFunctionsEndToEnd.Functions/AzureFunctionsEndToEnd.Functions.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
<PackageReference Include="Microsoft.Azure.Functions.Worker.Extensions.Http.AspNetCore" />
1313
<PackageReference Include="Microsoft.Azure.Functions.Worker.Extensions.Storage.Blobs" />
1414
<PackageReference Include="Microsoft.Azure.Functions.Worker.Extensions.Storage.Queues" />
15+
<PackageReference Include="Microsoft.Azure.Functions.Worker.Extensions.ServiceBus" />
1516
<PackageReference Include="Microsoft.Azure.Functions.Worker.Extensions.EventHubs" />
1617
<PackageReference Include="Microsoft.Azure.Functions.Worker.OpenTelemetry" />
1718
<PackageReference Include="Microsoft.Azure.Functions.Worker.Sdk" />
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
// Licensed to the .NET Foundation under one or more agreements.
2+
// The .NET Foundation licenses this file to you under the MIT license.
3+
4+
using Azure.Messaging.ServiceBus;
5+
using Microsoft.Azure.Functions.Worker;
6+
using Microsoft.Extensions.Logging;
7+
8+
namespace AzureFunctionsEndToEnd.Functions;
9+
10+
public class MyServiceBusTrigger(ILogger<MyServiceBusTrigger> logger)
11+
{
12+
[Function(nameof(MyServiceBusTrigger))]
13+
public void Run([ServiceBusTrigger("myqueue", Connection = "messaging" )] ServiceBusReceivedMessage message)
14+
{
15+
logger.LogInformation("Message ID: {id}", message.MessageId);
16+
logger.LogInformation("Message Body: {body}", message.Body);
17+
logger.LogInformation("Message Content-Type: {contentType}", message.ContentType);
18+
}
19+
}

src/Aspire.Hosting.Azure.ServiceBus/AzureServiceBusResource.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ namespace Aspire.Hosting.Azure;
1414
/// <param name="name">The name of the resource.</param>
1515
/// <param name="configureConstruct">Callback to configure the Azure Service Bus resource.</param>
1616
public class AzureServiceBusResource(string name, Action<ResourceModuleConstruct> configureConstruct)
17-
: AzureConstructResource(name, configureConstruct), IResourceWithConnectionString
17+
: AzureConstructResource(name, configureConstruct), IResourceWithConnectionString, IResourceWithAzureFunctionsConfig
1818
{
1919
internal List<(string Name, Action<IResourceBuilder<AzureServiceBusResource>, ResourceModuleConstruct, ServiceBusQueue>? Configure)> Queues { get; } = [];
2020
internal List<(string Name, Action<IResourceBuilder<AzureServiceBusResource>, ResourceModuleConstruct, ServiceBusTopic>? Configure)> Topics { get; } = [];
@@ -30,4 +30,9 @@ public class AzureServiceBusResource(string name, Action<ResourceModuleConstruct
3030
/// </summary>
3131
public ReferenceExpression ConnectionStringExpression =>
3232
ReferenceExpression.Create($"{ServiceBusEndpoint}");
33+
34+
void IResourceWithAzureFunctionsConfig.ApplyAzureFunctionsConfiguration(IDictionary<string, object> target, string connectionName)
35+
{
36+
target[$"{connectionName}__fullyQualifiedNamespace"] = ServiceBusEndpoint;
37+
}
3338
}

tests/Aspire.Playground.Tests/ProjectSpecificTests.cs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,15 +105,24 @@ await WaitForAllTextAsync(app,
105105
resourceName: "funcapp",
106106
timeoutSecs: 160);
107107

108-
// Assert that EventHubs triggers work correctly
109108
#if !SKIP_EVENTHUBS_EMULATION
109+
// Assert that EventHubs triggers work correctly
110110
await app.CreateHttpClient("apiservice").GetAsync("/publish/eventhubs");
111111
await WaitForAllTextAsync(app,
112112
[
113113
"Executed 'Functions.MyEventHubTrigger'"
114114
],
115115
resourceName: "funcapp",
116116
timeoutSecs: 160);
117+
118+
// Assert that ServiceBus triggers work correctly
119+
await app.CreateHttpClient("apiservice").GetAsync("/publish/asb");
120+
await WaitForAllTextAsync(app,
121+
[
122+
"Executed 'Functions.MyServiceBusTrigger'"
123+
],
124+
resourceName: "funcapp",
125+
timeoutSecs: 160);
117126
#endif
118127

119128
// TODO: The following line is commented out because the test fails due to an erroneous log in the Functions App

0 commit comments

Comments
 (0)