diff --git a/Snippets/ASBFunctionsWorker/ASBFunctionsWorker.sln b/Snippets/ASBFunctionsWorker/ASBFunctionsWorker.sln index 44bc7aa7cb9..5a38e593b2e 100644 --- a/Snippets/ASBFunctionsWorker/ASBFunctionsWorker.sln +++ b/Snippets/ASBFunctionsWorker/ASBFunctionsWorker.sln @@ -1,6 +1,6 @@ Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.0.31919.166 +# Visual Studio Version 18 +VisualStudioVersion = 18.0.11012.119 d18.0 MinimumVisualStudioVersion = 15.0.26730.12 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ASBFunctionsWorker_1", "ASBFunctionsWorker_1\ASBFunctionsWorker_1.csproj", "{A491A83E-174A-4639-B55E-72ED39DD955C}" EndProject @@ -14,6 +14,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ASBFunctionsWorker_5", "ASB EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ASBFunctionsWorker_6", "ASBFunctionsWorker_6\ASBFunctionsWorker_6.csproj", "{B447A2D5-2B62-4198-9519-12339CCCA403}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ASBFunctionsWorker_7", "ASBFunctionsWorker_7\ASBFunctionsWorker_7.csproj", "{A0D01DCB-8A89-A490-EDFB-A2F37CD721F8}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -44,6 +46,10 @@ Global {B447A2D5-2B62-4198-9519-12339CCCA403}.Debug|Any CPU.Build.0 = Debug|Any CPU {B447A2D5-2B62-4198-9519-12339CCCA403}.Release|Any CPU.ActiveCfg = Release|Any CPU {B447A2D5-2B62-4198-9519-12339CCCA403}.Release|Any CPU.Build.0 = Release|Any CPU + {A0D01DCB-8A89-A490-EDFB-A2F37CD721F8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A0D01DCB-8A89-A490-EDFB-A2F37CD721F8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A0D01DCB-8A89-A490-EDFB-A2F37CD721F8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A0D01DCB-8A89-A490-EDFB-A2F37CD721F8}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/Snippets/ASBFunctionsWorker/ASBFunctionsWorker_1/ASBFunctionsWorker_1.csproj b/Snippets/ASBFunctionsWorker/ASBFunctionsWorker_1/ASBFunctionsWorker_1.csproj index 23682158093..e4dbf27d2ae 100644 --- a/Snippets/ASBFunctionsWorker/ASBFunctionsWorker_1/ASBFunctionsWorker_1.csproj +++ b/Snippets/ASBFunctionsWorker/ASBFunctionsWorker_1/ASBFunctionsWorker_1.csproj @@ -1,23 +1,18 @@  - net8.0 + net10.0 - - + + - - - - - - - + + \ No newline at end of file diff --git a/Snippets/ASBFunctionsWorker/ASBFunctionsWorker_2/ASBFunctionsWorker_2.csproj b/Snippets/ASBFunctionsWorker/ASBFunctionsWorker_2/ASBFunctionsWorker_2.csproj index 0f1e302b11d..7c7115bbe77 100644 --- a/Snippets/ASBFunctionsWorker/ASBFunctionsWorker_2/ASBFunctionsWorker_2.csproj +++ b/Snippets/ASBFunctionsWorker/ASBFunctionsWorker_2/ASBFunctionsWorker_2.csproj @@ -1,23 +1,17 @@  - net8.0 + net10.0 - - + + - - - - - - - + \ No newline at end of file diff --git a/Snippets/ASBFunctionsWorker/ASBFunctionsWorker_3/ASBFunctionsWorker_3.csproj b/Snippets/ASBFunctionsWorker/ASBFunctionsWorker_3/ASBFunctionsWorker_3.csproj index a11dc78854a..89276c60755 100644 --- a/Snippets/ASBFunctionsWorker/ASBFunctionsWorker_3/ASBFunctionsWorker_3.csproj +++ b/Snippets/ASBFunctionsWorker/ASBFunctionsWorker_3/ASBFunctionsWorker_3.csproj @@ -1,19 +1,18 @@  - net8.0 + net10.0 - - + + - - + \ No newline at end of file diff --git a/Snippets/ASBFunctionsWorker/ASBFunctionsWorker_4/ASBFunctionsWorker_4.csproj b/Snippets/ASBFunctionsWorker/ASBFunctionsWorker_4/ASBFunctionsWorker_4.csproj index c84a1b501b2..dd6bf08a646 100644 --- a/Snippets/ASBFunctionsWorker/ASBFunctionsWorker_4/ASBFunctionsWorker_4.csproj +++ b/Snippets/ASBFunctionsWorker/ASBFunctionsWorker_4/ASBFunctionsWorker_4.csproj @@ -1,10 +1,13 @@  + - net8.0 + net10.0 + - + + \ No newline at end of file diff --git a/Snippets/ASBFunctionsWorker/ASBFunctionsWorker_5/ASBFunctionsWorker_5.csproj b/Snippets/ASBFunctionsWorker/ASBFunctionsWorker_5/ASBFunctionsWorker_5.csproj index 167d3bae4a9..0f9fc93e685 100644 --- a/Snippets/ASBFunctionsWorker/ASBFunctionsWorker_5/ASBFunctionsWorker_5.csproj +++ b/Snippets/ASBFunctionsWorker/ASBFunctionsWorker_5/ASBFunctionsWorker_5.csproj @@ -1,10 +1,13 @@  + - net8.0 + net10.0 + - + + \ No newline at end of file diff --git a/Snippets/ASBFunctionsWorker/ASBFunctionsWorker_6/ASBFunctionsWorker_6.csproj b/Snippets/ASBFunctionsWorker/ASBFunctionsWorker_6/ASBFunctionsWorker_6.csproj index fb9176c4d14..28e3c8b71df 100644 --- a/Snippets/ASBFunctionsWorker/ASBFunctionsWorker_6/ASBFunctionsWorker_6.csproj +++ b/Snippets/ASBFunctionsWorker/ASBFunctionsWorker_6/ASBFunctionsWorker_6.csproj @@ -1,10 +1,13 @@  + - net8.0 + net10.0 + - - + + + \ No newline at end of file diff --git a/Snippets/ASBFunctionsWorker/ASBFunctionsWorker_7/ASBFunctionsWorker_7.csproj b/Snippets/ASBFunctionsWorker/ASBFunctionsWorker_7/ASBFunctionsWorker_7.csproj new file mode 100644 index 00000000000..bbdb4cc94f7 --- /dev/null +++ b/Snippets/ASBFunctionsWorker/ASBFunctionsWorker_7/ASBFunctionsWorker_7.csproj @@ -0,0 +1,13 @@ + + + + net10.0 + + + + + + + + + \ No newline at end of file diff --git a/Snippets/ASBFunctionsWorker/ASBFunctionsWorker_7/Configuration.cs b/Snippets/ASBFunctionsWorker/ASBFunctionsWorker_7/Configuration.cs new file mode 100644 index 00000000000..a7537a5a88c --- /dev/null +++ b/Snippets/ASBFunctionsWorker/ASBFunctionsWorker_7/Configuration.cs @@ -0,0 +1,94 @@ +using System; +using System.Threading.Tasks; +using Azure.Storage.Blobs; +using Microsoft.Extensions.Hosting; +using NServiceBus; + +#region asb-function-isolated-configuration +[assembly: NServiceBusTriggerFunction("WorkerDemoEndpoint")] + +public class Program +{ + public static Task Main() + { + var host = new HostBuilder() + .ConfigureFunctionsWorkerDefaults() + .UseNServiceBus() + .Build(); + + return host.RunAsync(); + } +} +#endregion asb-function-isolated-configuration + +class EnableDiagnostics +{ + #region asb-function-isolated-enable-diagnostics + public static Task Main() + { + var host = new HostBuilder() + .ConfigureFunctionsWorkerDefaults() + .UseNServiceBus(configuration => + { + configuration.LogDiagnostics(); + }) + .Build(); + + return host.RunAsync(); + } + #endregion +} + +class EnableDiagnosticsBlob +{ + public static Task Main() + { + var endpointName = "ASBWorkerEndpoint"; + + #region asb-function-iso-diagnostics-blob + var host = new HostBuilder() + .ConfigureFunctionsWorkerDefaults() + .UseNServiceBus(configuration => + { + configuration.AdvancedConfiguration.CustomDiagnosticsWriter( + async (diagnostics, cancellationToken) => + { + var connectionString = Environment.GetEnvironmentVariable("AzureWebJobsStorage"); + var blobServiceClient = new BlobServiceClient(connectionString); + + var containerClient = blobServiceClient.GetBlobContainerClient("diagnostics"); + await containerClient.CreateIfNotExistsAsync(cancellationToken: cancellationToken); + + var blobName = $"{endpointName}-configuration.txt"; + var blobClient = containerClient.GetBlobClient(blobName); + await blobClient.UploadAsync(BinaryData.FromString(diagnostics), cancellationToken); + }); + }) + .Build(); + #endregion + return host.RunAsync(); + } + +} + +class ConfigureErrorQueue +{ + #region asb-function-isolated-configure-error-queue + public static Task Main() + { + var host = new HostBuilder() + .ConfigureFunctionsWorkerDefaults() + .UseNServiceBus(configuration => + { + // Change the error queue name: + configuration.AdvancedConfiguration.SendFailedMessagesTo("my-custom-error-queue"); + + // Or disable the error queue to let ASB native dead-lettering handle repeated failures: + configuration.DoNotSendMessagesToErrorQueue(); + }) + .Build(); + + return host.RunAsync(); + } + #endregion +} \ No newline at end of file diff --git a/Snippets/ASBFunctionsWorker/ASBFunctionsWorker_7/Identity.txt b/Snippets/ASBFunctionsWorker/ASBFunctionsWorker_7/Identity.txt new file mode 100644 index 00000000000..6229b10fb4b --- /dev/null +++ b/Snippets/ASBFunctionsWorker/ASBFunctionsWorker_7/Identity.txt @@ -0,0 +1,3 @@ +#startcode asb-function-isolated-identity-connection +[assembly: NServiceBusTriggerFunction("WorkerDemoEndpoint", Connection = "MyConnectionName")] +#endcode \ No newline at end of file diff --git a/Snippets/ASBFunctionsWorker/ASBFunctionsWorker_7/Sending.cs b/Snippets/ASBFunctionsWorker/ASBFunctionsWorker_7/Sending.cs new file mode 100644 index 00000000000..5296aacc5a9 --- /dev/null +++ b/Snippets/ASBFunctionsWorker/ASBFunctionsWorker_7/Sending.cs @@ -0,0 +1,34 @@ +namespace ASBFunctionsWorker_5 +{ + using Microsoft.Azure.Functions.Worker; + using Microsoft.Azure.Functions.Worker.Http; + using NServiceBus; + using System.Net; + using System.Threading.Tasks; + + #region asb-function-isolated-dispatching-outside-message-handler + public class HttpTrigger + { + readonly IFunctionEndpoint functionEndpoint; + + public HttpTrigger(IFunctionEndpoint functionEndpoint) + { + this.functionEndpoint = functionEndpoint; + } + + [Function("HttpSender")] + public async Task Run( + [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequestData req, + FunctionContext executionContext) + { + await functionEndpoint.Send(new TriggerMessage(), executionContext); + + return req.CreateResponse(HttpStatusCode.OK); + } + } + #endregion + + class TriggerMessage + { + } +} \ No newline at end of file diff --git a/Snippets/ASBFunctionsWorker/ASBFunctionsWorker_7/TopologyOptions.cs b/Snippets/ASBFunctionsWorker/ASBFunctionsWorker_7/TopologyOptions.cs new file mode 100644 index 00000000000..4aa17377331 --- /dev/null +++ b/Snippets/ASBFunctionsWorker/ASBFunctionsWorker_7/TopologyOptions.cs @@ -0,0 +1,20 @@ +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Hosting; +using NServiceBus; + +namespace ASBFunctionsWorker_6 +{ + class TopologyOptions + { + public void SetTopologyOptions() + { + #region ASBFunctionsWorker-topology-options + var host = new HostBuilder() + .ConfigureFunctionsWorkerDefaults() + .ConfigureAppConfiguration(builder => builder.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)) + .UseNServiceBus() + .Build(); + #endregion + } + } +} diff --git a/Snippets/ASBFunctionsWorker/ASBFunctionsWorker_7/TriggerDefinition.cs b/Snippets/ASBFunctionsWorker/ASBFunctionsWorker_7/TriggerDefinition.cs new file mode 100644 index 00000000000..7e2ce0a6573 --- /dev/null +++ b/Snippets/ASBFunctionsWorker/ASBFunctionsWorker_7/TriggerDefinition.cs @@ -0,0 +1,44 @@ +namespace ASBFunctionsWorker_6; + +using System.Threading; +using System.Threading.Tasks; +using Azure.Messaging.ServiceBus; +using Microsoft.Azure.Functions.Worker; +using Microsoft.Extensions.Hosting; +using NServiceBus; + +#region custom-trigger-definition + +class CustomTriggerDefinition +{ + IFunctionEndpoint functionEndpoint; + + public CustomTriggerDefinition(IFunctionEndpoint functionEndpoint) + { + this.functionEndpoint = functionEndpoint; + } + + [Function("MyCustomTrigger")] + public async Task Run( + [ServiceBusTrigger("MyFunctionsEndpoint")] + ServiceBusReceivedMessage message, ServiceBusMessageActions messageActions, FunctionContext context, + CancellationToken cancellationToken = default) + { + await functionEndpoint.Process(message, messageActions, context, cancellationToken); + } +} + +public class Program +{ + public async Task Main() + { + var host = new HostBuilder() + .ConfigureFunctionsWorkerDefaults() + .UseNServiceBus("MyFunctionsEndpoint") + .Build(); + + await host.RunAsync(); + } +} + +#endregion \ No newline at end of file diff --git a/Snippets/ASBFunctionsWorker/ASBFunctionsWorker_7/appsettings.migration.json b/Snippets/ASBFunctionsWorker/ASBFunctionsWorker_7/appsettings.migration.json new file mode 100644 index 00000000000..968cbb1ffcc --- /dev/null +++ b/Snippets/ASBFunctionsWorker/ASBFunctionsWorker_7/appsettings.migration.json @@ -0,0 +1,25 @@ +#startcode ASBFunctionsWorker-topology-migration-options-json +{ + "AzureServiceBus": { + "MigrationTopologyOptions": { + "TopicToPublishTo": "TopicToPublishTo", + "TopicToSubscribeOn": "TopicToSubscribeOn", + "EventsToMigrateMap": [ + "MyNamespace.NotYetMigratedEvent" + ], + "SubscribedEventToRuleNameMap": { + "MyNamespace.NotYetMigratedEvent": "EventRuleName" + }, + "PublishedEventToTopicsMap": { + "MyNamespace.MigratedEvent": "MigratedEvent" + }, + "SubscribedEventToTopicsMap": { + "MyNamespace.MigratedEvent": "MigratedEvent" + }, + "QueueNameToSubscriptionNameMap": { + "Publisher": "PublisherSubscriptionName" + } + } + } +} +#endcode \ No newline at end of file diff --git a/Snippets/ASBFunctionsWorker/ASBFunctionsWorker_7/appsettings.topology.json b/Snippets/ASBFunctionsWorker/ASBFunctionsWorker_7/appsettings.topology.json new file mode 100644 index 00000000000..734888c5087 --- /dev/null +++ b/Snippets/ASBFunctionsWorker/ASBFunctionsWorker_7/appsettings.topology.json @@ -0,0 +1,20 @@ +#startcode ASBFunctionsWorker-topology-options-json +{ + "AzureServiceBus": { + "TopologyOptions": { + "PublishedEventToTopicsMap": { + "MyNamespace.SomeEvent": "some-event" + }, + "SubscribedEventToTopicsMap": { + "MyNamespace.SomeEvent": [ + "some-event", + "some-other-event" + ] + }, + "QueueNameToSubscriptionNameMap": { + "Publisher": "PublisherSubscriptionName" + } + } + } +} +#endcode \ No newline at end of file diff --git a/Snippets/ASBFunctionsWorker/ASBFunctionsWorker_6/prerelease.txt b/Snippets/ASBFunctionsWorker/ASBFunctionsWorker_7/prerelease.txt similarity index 100% rename from Snippets/ASBFunctionsWorker/ASBFunctionsWorker_6/prerelease.txt rename to Snippets/ASBFunctionsWorker/ASBFunctionsWorker_7/prerelease.txt diff --git a/samples/azure-functions/service-bus-kafka/ASBS_3/AzureFunctions.KafkaTrigger.FunctionsHostBuilder/AzureFunctions.KafkaTrigger.FunctionsHostBuilder.csproj b/samples/azure-functions/service-bus-kafka/ASBS_3/AzureFunctions.KafkaTrigger.FunctionsHostBuilder/AzureFunctions.KafkaTrigger.FunctionsHostBuilder.csproj index 4fe46b9ea68..48c490d0b43 100644 --- a/samples/azure-functions/service-bus-kafka/ASBS_3/AzureFunctions.KafkaTrigger.FunctionsHostBuilder/AzureFunctions.KafkaTrigger.FunctionsHostBuilder.csproj +++ b/samples/azure-functions/service-bus-kafka/ASBS_3/AzureFunctions.KafkaTrigger.FunctionsHostBuilder/AzureFunctions.KafkaTrigger.FunctionsHostBuilder.csproj @@ -1,23 +1,29 @@  + net9.0;net8.0 + Exe v4 + enable 12.0 - Exe + + + + + - + + - - + - - - + + \ No newline at end of file diff --git a/samples/azure-functions/service-bus-kafka/ASBS_3/AzureFunctions.KafkaTrigger.FunctionsHostBuilder/KafkaTrigger.cs b/samples/azure-functions/service-bus-kafka/ASBS_3/AzureFunctions.KafkaTrigger.FunctionsHostBuilder/KafkaTrigger.cs index 47d0bba0258..5193bc7685b 100644 --- a/samples/azure-functions/service-bus-kafka/ASBS_3/AzureFunctions.KafkaTrigger.FunctionsHostBuilder/KafkaTrigger.cs +++ b/samples/azure-functions/service-bus-kafka/ASBS_3/AzureFunctions.KafkaTrigger.FunctionsHostBuilder/KafkaTrigger.cs @@ -1,5 +1,4 @@ -using System.Threading.Tasks; -using AzureFunctions.Messages.NServiceBusMessages; +using AzureFunctions.Messages.NServiceBusMessages; using Microsoft.Azure.Functions.Worker; using Microsoft.Extensions.Logging; using Newtonsoft.Json.Linq; @@ -7,24 +6,14 @@ namespace AzureFunctions.KafkaTrigger.FunctionsHostBuilder; -public class KafkaTrigger +public class KafkaTrigger(IMessageSession messageSession, ILogger logger) { - readonly IMessageSession messageSession; - readonly ILogger logger; - - public KafkaTrigger(IMessageSession messageSession, ILogger logger) - { - this.messageSession = messageSession; - this.logger = logger; - } - #region KafkaTrigger [Function(nameof(ElectricityUsage))] public async Task ElectricityUsage([KafkaTrigger("LocalKafkaBroker", "topic", ConsumerGroup = "$Default")] string eventData, FunctionContext context) { - var eventValue = JObject.Parse(eventData)["Value"]?.ToString(); var electricityUsage = Messages.KafkaMessages.ElectricityUsage.Deserialize(eventValue); diff --git a/samples/azure-functions/service-bus-kafka/ASBS_3/AzureFunctions.KafkaTrigger.FunctionsHostBuilder/Program.cs b/samples/azure-functions/service-bus-kafka/ASBS_3/AzureFunctions.KafkaTrigger.FunctionsHostBuilder/Program.cs index f0a1bb1c5f9..d2038b3dd3e 100644 --- a/samples/azure-functions/service-bus-kafka/ASBS_3/AzureFunctions.KafkaTrigger.FunctionsHostBuilder/Program.cs +++ b/samples/azure-functions/service-bus-kafka/ASBS_3/AzureFunctions.KafkaTrigger.FunctionsHostBuilder/Program.cs @@ -1,41 +1,31 @@ -using System; -using System.Threading.Tasks; -using AzureFunctions.Messages.NServiceBusMessages; +using AzureFunctions.Messages.NServiceBusMessages; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using NServiceBus; -namespace AzureFunctions.KafkaTrigger.FunctionsHostBuilder; +#region SetupNServiceBusSendOnly -public class Program -{ - public static async Task Main() +var host = new HostBuilder() + .ConfigureServices(async services => { - #region SetupNServiceBusSendOnly + var cfg = new EndpointConfiguration("SendOnly"); + cfg.SendOnly(); + cfg.UseSerialization(); - var host = new HostBuilder() - .ConfigureServices(async services => - { - var cfg = new EndpointConfiguration("SendOnly"); - cfg.SendOnly(); - cfg.UseSerialization(); + var connectionString = Environment.GetEnvironmentVariable("AzureWebJobsServiceBus"); + var transport = new AzureServiceBusTransport(connectionString); + var routing = cfg.UseTransport(transport); - var connectionString = Environment.GetEnvironmentVariable("AzureWebJobsServiceBus"); - var transport = new AzureServiceBusTransport(connectionString); - var routing = cfg.UseTransport(transport); + routing.RouteToEndpoint(typeof(FollowUp), "Samples.KafkaTrigger.ConsoleEndpoint"); - routing.RouteToEndpoint(typeof(FollowUp), "Samples.KafkaTrigger.ConsoleEndpoint"); + var endpoint = await Endpoint.Start(cfg); - var endpoint = await Endpoint.Start(cfg); + // Inject the endpoint in the DI container + services.AddSingleton(endpoint); + }) + .ConfigureFunctionsWorkerDefaults() + .Build(); - // Inject the endpoint in the DI container - services.AddSingleton(endpoint); - }) - .ConfigureFunctionsWorkerDefaults() - .Build(); +#endregion - #endregion - - await host.RunAsync(); - } -} \ No newline at end of file +await host.RunAsync(); \ No newline at end of file diff --git a/samples/azure-functions/service-bus-kafka/ASBS_3/AzureFunctions.KafkaTrigger.FunctionsHostBuilder/host.json b/samples/azure-functions/service-bus-kafka/ASBS_3/AzureFunctions.KafkaTrigger.FunctionsHostBuilder/host.json index 9e6ce8c54c9..610d7e0ac7a 100644 --- a/samples/azure-functions/service-bus-kafka/ASBS_3/AzureFunctions.KafkaTrigger.FunctionsHostBuilder/host.json +++ b/samples/azure-functions/service-bus-kafka/ASBS_3/AzureFunctions.KafkaTrigger.FunctionsHostBuilder/host.json @@ -1,8 +1,8 @@ { "version": "2.0", "extensions": { - "ServiceBus": { - "EnableCrossEntityTransactions": true + "serviceBus": { + "enableCrossEntityTransactions": true } } } \ No newline at end of file diff --git a/samples/azure-functions/service-bus-kafka/ASBS_3/AzureFunctions.Messages/AzureFunctions.Messages.csproj b/samples/azure-functions/service-bus-kafka/ASBS_3/AzureFunctions.Messages/AzureFunctions.Messages.csproj index 05b765b0196..b7090e186d1 100644 --- a/samples/azure-functions/service-bus-kafka/ASBS_3/AzureFunctions.Messages/AzureFunctions.Messages.csproj +++ b/samples/azure-functions/service-bus-kafka/ASBS_3/AzureFunctions.Messages/AzureFunctions.Messages.csproj @@ -1,9 +1,13 @@ - + + net9.0;net8.0 + enable 12.0 + + \ No newline at end of file diff --git a/samples/azure-functions/service-bus-kafka/ASBS_3/AzureFunctions.Messages/FollowUp.cs b/samples/azure-functions/service-bus-kafka/ASBS_3/AzureFunctions.Messages/FollowUp.cs index 4403282bf8b..faa6ed2b041 100644 --- a/samples/azure-functions/service-bus-kafka/ASBS_3/AzureFunctions.Messages/FollowUp.cs +++ b/samples/azure-functions/service-bus-kafka/ASBS_3/AzureFunctions.Messages/FollowUp.cs @@ -1,10 +1,10 @@ -using NServiceBus; - -namespace AzureFunctions.Messages.NServiceBusMessages; +namespace AzureFunctions.Messages.NServiceBusMessages; public class FollowUp : IMessage { public int CustomerId { get; set; } + public int UnitId { get; set; } + public string Description { get; set; } } \ No newline at end of file diff --git a/samples/azure-functions/service-bus-kafka/ASBS_3/AzureFunctions.Messages/KafkaMessages/ElectricityUsage.cs b/samples/azure-functions/service-bus-kafka/ASBS_3/AzureFunctions.Messages/KafkaMessages/ElectricityUsage.cs index 0d0ceb394fd..2e2ce465a49 100644 --- a/samples/azure-functions/service-bus-kafka/ASBS_3/AzureFunctions.Messages/KafkaMessages/ElectricityUsage.cs +++ b/samples/azure-functions/service-bus-kafka/ASBS_3/AzureFunctions.Messages/KafkaMessages/ElectricityUsage.cs @@ -5,7 +5,9 @@ namespace AzureFunctions.Messages.KafkaMessages; public class ElectricityUsage { public int CustomerId { get; set; } + public int UnitId { get; set; } + public int CurrentUsage { get; set; } public static string Serialize(ElectricityUsage electricityUsage) diff --git a/samples/azure-functions/service-bus-kafka/ASBS_3/ConsoleEndpoint/Program.cs b/samples/azure-functions/service-bus-kafka/ASBS_3/ConsoleEndpoint/Program.cs index c531741a9cd..e66aefca9f7 100644 --- a/samples/azure-functions/service-bus-kafka/ASBS_3/ConsoleEndpoint/Program.cs +++ b/samples/azure-functions/service-bus-kafka/ASBS_3/ConsoleEndpoint/Program.cs @@ -2,71 +2,65 @@ using Confluent.Kafka; using NServiceBus; -class Program -{ - static async Task Main() - { - const string endpointName = "Samples.KafkaTrigger.ConsoleEndpoint"; - Console.Title = endpointName; +const string endpointName = "Samples.KafkaTrigger.ConsoleEndpoint"; +Console.Title = endpointName; - var endpointConfiguration = new EndpointConfiguration(endpointName); - endpointConfiguration.EnableInstallers(); - endpointConfiguration.UseSerialization(); +var endpointConfiguration = new EndpointConfiguration(endpointName); +endpointConfiguration.EnableInstallers(); +endpointConfiguration.UseSerialization(); - var connectionString = Environment.GetEnvironmentVariable("AzureServiceBus_ConnectionString"); - if (string.IsNullOrWhiteSpace(connectionString)) - { - throw new Exception("Could not read the 'AzureServiceBus_ConnectionString' environment variable. Check the sample prerequisites."); - } +var connectionString = Environment.GetEnvironmentVariable("AzureServiceBus_ConnectionString"); +if (string.IsNullOrWhiteSpace(connectionString)) +{ + throw new Exception("Could not read the 'AzureServiceBus_ConnectionString' environment variable. Check the sample prerequisites."); +} - var transport = new AzureServiceBusTransport(connectionString); - endpointConfiguration.UseTransport(transport); +var transport = new AzureServiceBusTransport(connectionString); +endpointConfiguration.UseTransport(transport); - var endpointInstance = await Endpoint.Start(endpointConfiguration); +var endpointInstance = await Endpoint.Start(endpointConfiguration); - var config = new ProducerConfig - { - BootstrapServers = "localhost:9094", - ClientId = "producer-1", - BatchSize = 50 - }; +var config = new ProducerConfig +{ + BootstrapServers = "localhost:9094", + ClientId = "producer-1", + BatchSize = 50 +}; - Console.WriteLine("Press '[enter]' to send a 100 events using Kafka and wait for a possible response..."); - Console.WriteLine("Press any other key to exit"); +Console.WriteLine("Press '[enter]' to send a 100 events using Kafka and wait for a possible response..."); +Console.WriteLine("Press any other key to exit"); - using (var producer = new ProducerBuilder(config) - .Build()) - { - while (true) - { - var key = Console.ReadKey(); - Console.WriteLine(); - - if (key.Key != ConsoleKey.Enter) - { - break; - } +using (var producer = new ProducerBuilder(config) + .Build()) +{ + while (true) + { + var key = Console.ReadKey(); + Console.WriteLine(); - for (int i = 0; i < 100; i++) - { - #region ProduceEvent + if (key.Key != ConsoleKey.Enter) + { + break; + } - var electricityUsage = new ElectricityUsage() { CustomerId = 42, CurrentUsage = i, UnitId = 1337 }; + for (int i = 0; i < 100; i++) + { + #region ProduceEvent - var message = new Message - { - Value = ElectricityUsage.Serialize(electricityUsage) - }; + var electricityUsage = new ElectricityUsage() { CustomerId = 42, CurrentUsage = i, UnitId = 1337 }; - var deliveryResult = await producer.ProduceAsync("myKafkaTopic", message); + var message = new Message + { + Value = ElectricityUsage.Serialize(electricityUsage) + }; - #endregion - } + var deliveryResult = await producer.ProduceAsync("myKafkaTopic", message); - Console.WriteLine("100 messages sent"); - } + #endregion } - await endpointInstance.Stop(); + Console.WriteLine("100 messages sent"); } -} \ No newline at end of file +} + +await endpointInstance.Stop(); \ No newline at end of file diff --git a/samples/azure-functions/service-bus-kafka/ASBS_4/AzureFunctions.KafkaTrigger.FunctionsHostBuilder/AzureFunctions.KafkaTrigger.FunctionsHostBuilder.csproj b/samples/azure-functions/service-bus-kafka/ASBS_4/AzureFunctions.KafkaTrigger.FunctionsHostBuilder/AzureFunctions.KafkaTrigger.FunctionsHostBuilder.csproj index 18e731fbc9b..c21ae346dbf 100644 --- a/samples/azure-functions/service-bus-kafka/ASBS_4/AzureFunctions.KafkaTrigger.FunctionsHostBuilder/AzureFunctions.KafkaTrigger.FunctionsHostBuilder.csproj +++ b/samples/azure-functions/service-bus-kafka/ASBS_4/AzureFunctions.KafkaTrigger.FunctionsHostBuilder/AzureFunctions.KafkaTrigger.FunctionsHostBuilder.csproj @@ -1,22 +1,28 @@ + net9.0;net8.0 + Exe v4 + enable 12.0 - Exe + - - - - - + + - + + + + + + + \ No newline at end of file diff --git a/samples/azure-functions/service-bus-kafka/ASBS_4/AzureFunctions.KafkaTrigger.FunctionsHostBuilder/KafkaTrigger.cs b/samples/azure-functions/service-bus-kafka/ASBS_4/AzureFunctions.KafkaTrigger.FunctionsHostBuilder/KafkaTrigger.cs index 316a7aa6044..307e45a7f29 100644 --- a/samples/azure-functions/service-bus-kafka/ASBS_4/AzureFunctions.KafkaTrigger.FunctionsHostBuilder/KafkaTrigger.cs +++ b/samples/azure-functions/service-bus-kafka/ASBS_4/AzureFunctions.KafkaTrigger.FunctionsHostBuilder/KafkaTrigger.cs @@ -1,24 +1,18 @@ -using Microsoft.Azure.Functions.Worker; -using Microsoft.Extensions.Logging; -using NServiceBus; -using System.Threading.Tasks; +using System.Text.Json.Nodes; using AzureFunctions.Messages.NServiceBusMessages; -using System.Text.Json.Nodes; +using Microsoft.Azure.Functions.Worker; +using Microsoft.Extensions.Logging; namespace AzureFunctions.KafkaTrigger.FunctionsHostBuilder; public class KafkaTrigger(IMessageSession messageSession, ILogger logger) { - readonly IMessageSession messageSession = messageSession; - readonly ILogger logger = logger; - #region KafkaTrigger [Function(nameof(ElectricityUsage))] public async Task ElectricityUsage([KafkaTrigger("LocalKafkaBroker", "topic", ConsumerGroup = "$Default")] string eventData, FunctionContext context) { - var eventValue = JsonNode.Parse(eventData)["Value"]?.ToString(); var electricityUsage = Messages.KafkaMessages.ElectricityUsage.Deserialize(eventValue); diff --git a/samples/azure-functions/service-bus-kafka/ASBS_4/AzureFunctions.KafkaTrigger.FunctionsHostBuilder/Program.cs b/samples/azure-functions/service-bus-kafka/ASBS_4/AzureFunctions.KafkaTrigger.FunctionsHostBuilder/Program.cs index f0a1bb1c5f9..4d0c9f3397f 100644 --- a/samples/azure-functions/service-bus-kafka/ASBS_4/AzureFunctions.KafkaTrigger.FunctionsHostBuilder/Program.cs +++ b/samples/azure-functions/service-bus-kafka/ASBS_4/AzureFunctions.KafkaTrigger.FunctionsHostBuilder/Program.cs @@ -1,41 +1,29 @@ -using System; -using System.Threading.Tasks; -using AzureFunctions.Messages.NServiceBusMessages; +using AzureFunctions.Messages.NServiceBusMessages; +using Microsoft.Azure.Functions.Worker.Builder; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; -using NServiceBus; -namespace AzureFunctions.KafkaTrigger.FunctionsHostBuilder; +#region SetupNServiceBusSendOnly -public class Program -{ - public static async Task Main() - { - #region SetupNServiceBusSendOnly +var builder = FunctionsApplication.CreateBuilder(args); - var host = new HostBuilder() - .ConfigureServices(async services => - { - var cfg = new EndpointConfiguration("SendOnly"); - cfg.SendOnly(); - cfg.UseSerialization(); +var cfg = new EndpointConfiguration("SendOnly"); +cfg.SendOnly(); +cfg.UseSerialization(); - var connectionString = Environment.GetEnvironmentVariable("AzureWebJobsServiceBus"); - var transport = new AzureServiceBusTransport(connectionString); - var routing = cfg.UseTransport(transport); +var connectionString = Environment.GetEnvironmentVariable("AzureWebJobsServiceBus"); +var transport = new AzureServiceBusTransport(connectionString); +var routing = cfg.UseTransport(transport); - routing.RouteToEndpoint(typeof(FollowUp), "Samples.KafkaTrigger.ConsoleEndpoint"); +routing.RouteToEndpoint(typeof(FollowUp), "Samples.KafkaTrigger.ConsoleEndpoint"); - var endpoint = await Endpoint.Start(cfg); +var endpoint = await Endpoint.Start(cfg); - // Inject the endpoint in the DI container - services.AddSingleton(endpoint); - }) - .ConfigureFunctionsWorkerDefaults() - .Build(); +// Inject the endpoint in the DI container +builder.Services.AddSingleton(endpoint); - #endregion +var host = builder.Build(); - await host.RunAsync(); - } -} \ No newline at end of file +#endregion + +await host.RunAsync(); \ No newline at end of file diff --git a/samples/azure-functions/service-bus-kafka/ASBS_4/AzureFunctions.KafkaTrigger.FunctionsHostBuilder/host.json b/samples/azure-functions/service-bus-kafka/ASBS_4/AzureFunctions.KafkaTrigger.FunctionsHostBuilder/host.json index 9e6ce8c54c9..610d7e0ac7a 100644 --- a/samples/azure-functions/service-bus-kafka/ASBS_4/AzureFunctions.KafkaTrigger.FunctionsHostBuilder/host.json +++ b/samples/azure-functions/service-bus-kafka/ASBS_4/AzureFunctions.KafkaTrigger.FunctionsHostBuilder/host.json @@ -1,8 +1,8 @@ { "version": "2.0", "extensions": { - "ServiceBus": { - "EnableCrossEntityTransactions": true + "serviceBus": { + "enableCrossEntityTransactions": true } } } \ No newline at end of file diff --git a/samples/azure-functions/service-bus-kafka/ASBS_4/AzureFunctions.Messages/AzureFunctions.Messages.csproj b/samples/azure-functions/service-bus-kafka/ASBS_4/AzureFunctions.Messages/AzureFunctions.Messages.csproj index 72aec1f4abf..6c47b6d7476 100644 --- a/samples/azure-functions/service-bus-kafka/ASBS_4/AzureFunctions.Messages/AzureFunctions.Messages.csproj +++ b/samples/azure-functions/service-bus-kafka/ASBS_4/AzureFunctions.Messages/AzureFunctions.Messages.csproj @@ -1,9 +1,13 @@ + net9.0;net8.0 + enable 12.0 + + \ No newline at end of file diff --git a/samples/azure-functions/service-bus-kafka/ASBS_4/AzureFunctions.Messages/FollowUp.cs b/samples/azure-functions/service-bus-kafka/ASBS_4/AzureFunctions.Messages/FollowUp.cs index 4403282bf8b..faa6ed2b041 100644 --- a/samples/azure-functions/service-bus-kafka/ASBS_4/AzureFunctions.Messages/FollowUp.cs +++ b/samples/azure-functions/service-bus-kafka/ASBS_4/AzureFunctions.Messages/FollowUp.cs @@ -1,10 +1,10 @@ -using NServiceBus; - -namespace AzureFunctions.Messages.NServiceBusMessages; +namespace AzureFunctions.Messages.NServiceBusMessages; public class FollowUp : IMessage { public int CustomerId { get; set; } + public int UnitId { get; set; } + public string Description { get; set; } } \ No newline at end of file diff --git a/samples/azure-functions/service-bus-kafka/ASBS_4/AzureFunctions.Messages/KafkaMessages/ElectricityUsage.cs b/samples/azure-functions/service-bus-kafka/ASBS_4/AzureFunctions.Messages/KafkaMessages/ElectricityUsage.cs index 0d0ceb394fd..2e2ce465a49 100644 --- a/samples/azure-functions/service-bus-kafka/ASBS_4/AzureFunctions.Messages/KafkaMessages/ElectricityUsage.cs +++ b/samples/azure-functions/service-bus-kafka/ASBS_4/AzureFunctions.Messages/KafkaMessages/ElectricityUsage.cs @@ -5,7 +5,9 @@ namespace AzureFunctions.Messages.KafkaMessages; public class ElectricityUsage { public int CustomerId { get; set; } + public int UnitId { get; set; } + public int CurrentUsage { get; set; } public static string Serialize(ElectricityUsage electricityUsage) diff --git a/samples/azure-functions/service-bus-kafka/ASBS_4/ConsoleEndpoint/Handlers/FollowUpHandler.cs b/samples/azure-functions/service-bus-kafka/ASBS_4/ConsoleEndpoint/Handlers/FollowUpHandler.cs index b226ef22b34..1f743498b54 100644 --- a/samples/azure-functions/service-bus-kafka/ASBS_4/ConsoleEndpoint/Handlers/FollowUpHandler.cs +++ b/samples/azure-functions/service-bus-kafka/ASBS_4/ConsoleEndpoint/Handlers/FollowUpHandler.cs @@ -1,5 +1,4 @@ using AzureFunctions.Messages.NServiceBusMessages; -using NServiceBus; namespace ConsoleEndpoint.Handlers; diff --git a/samples/azure-functions/service-bus-kafka/ASBS_4/ConsoleEndpoint/Program.cs b/samples/azure-functions/service-bus-kafka/ASBS_4/ConsoleEndpoint/Program.cs index c531741a9cd..3744877777e 100644 --- a/samples/azure-functions/service-bus-kafka/ASBS_4/ConsoleEndpoint/Program.cs +++ b/samples/azure-functions/service-bus-kafka/ASBS_4/ConsoleEndpoint/Program.cs @@ -1,72 +1,65 @@ using AzureFunctions.Messages.KafkaMessages; using Confluent.Kafka; -using NServiceBus; -class Program -{ - static async Task Main() - { - const string endpointName = "Samples.KafkaTrigger.ConsoleEndpoint"; - Console.Title = endpointName; +const string endpointName = "Samples.KafkaTrigger.ConsoleEndpoint"; +Console.Title = endpointName; - var endpointConfiguration = new EndpointConfiguration(endpointName); - endpointConfiguration.EnableInstallers(); - endpointConfiguration.UseSerialization(); +var endpointConfiguration = new EndpointConfiguration(endpointName); +endpointConfiguration.EnableInstallers(); +endpointConfiguration.UseSerialization(); - var connectionString = Environment.GetEnvironmentVariable("AzureServiceBus_ConnectionString"); - if (string.IsNullOrWhiteSpace(connectionString)) - { - throw new Exception("Could not read the 'AzureServiceBus_ConnectionString' environment variable. Check the sample prerequisites."); - } +var connectionString = Environment.GetEnvironmentVariable("AzureServiceBus_ConnectionString"); +if (string.IsNullOrWhiteSpace(connectionString)) +{ + throw new Exception("Could not read the 'AzureServiceBus_ConnectionString' environment variable. Check the sample prerequisites."); +} - var transport = new AzureServiceBusTransport(connectionString); - endpointConfiguration.UseTransport(transport); +var transport = new AzureServiceBusTransport(connectionString); +endpointConfiguration.UseTransport(transport); - var endpointInstance = await Endpoint.Start(endpointConfiguration); +var endpointInstance = await Endpoint.Start(endpointConfiguration); - var config = new ProducerConfig - { - BootstrapServers = "localhost:9094", - ClientId = "producer-1", - BatchSize = 50 - }; +var config = new ProducerConfig +{ + BootstrapServers = "localhost:9094", + ClientId = "producer-1", + BatchSize = 50 +}; - Console.WriteLine("Press '[enter]' to send a 100 events using Kafka and wait for a possible response..."); - Console.WriteLine("Press any other key to exit"); +Console.WriteLine("Press '[enter]' to send a 100 events using Kafka and wait for a possible response..."); +Console.WriteLine("Press any other key to exit"); - using (var producer = new ProducerBuilder(config) - .Build()) - { - while (true) - { - var key = Console.ReadKey(); - Console.WriteLine(); - - if (key.Key != ConsoleKey.Enter) - { - break; - } +using (var producer = new ProducerBuilder(config) + .Build()) +{ + while (true) + { + var key = Console.ReadKey(); + Console.WriteLine(); - for (int i = 0; i < 100; i++) - { - #region ProduceEvent + if (key.Key != ConsoleKey.Enter) + { + break; + } - var electricityUsage = new ElectricityUsage() { CustomerId = 42, CurrentUsage = i, UnitId = 1337 }; + for (int i = 0; i < 100; i++) + { + #region ProduceEvent - var message = new Message - { - Value = ElectricityUsage.Serialize(electricityUsage) - }; + var electricityUsage = new ElectricityUsage() { CustomerId = 42, CurrentUsage = i, UnitId = 1337 }; - var deliveryResult = await producer.ProduceAsync("myKafkaTopic", message); + var message = new Message + { + Value = ElectricityUsage.Serialize(electricityUsage) + }; - #endregion - } + var deliveryResult = await producer.ProduceAsync("myKafkaTopic", message); - Console.WriteLine("100 messages sent"); - } + #endregion } - await endpointInstance.Stop(); + Console.WriteLine("100 messages sent"); } -} \ No newline at end of file +} + +await endpointInstance.Stop(); \ No newline at end of file diff --git a/samples/azure-functions/service-bus-kafka/ASBS_5/AzureFunctions.KafkaTrigger.FunctionsHostBuilder/AzureFunctions.KafkaTrigger.FunctionsHostBuilder.csproj b/samples/azure-functions/service-bus-kafka/ASBS_5/AzureFunctions.KafkaTrigger.FunctionsHostBuilder/AzureFunctions.KafkaTrigger.FunctionsHostBuilder.csproj index 6de882268ad..accd58a1c65 100644 --- a/samples/azure-functions/service-bus-kafka/ASBS_5/AzureFunctions.KafkaTrigger.FunctionsHostBuilder/AzureFunctions.KafkaTrigger.FunctionsHostBuilder.csproj +++ b/samples/azure-functions/service-bus-kafka/ASBS_5/AzureFunctions.KafkaTrigger.FunctionsHostBuilder/AzureFunctions.KafkaTrigger.FunctionsHostBuilder.csproj @@ -1,22 +1,28 @@ + net9.0;net8.0 + Exe v4 + enable 12.0 - Exe + - - - - - + + - + + + + + + + \ No newline at end of file diff --git a/samples/azure-functions/service-bus-kafka/ASBS_5/AzureFunctions.KafkaTrigger.FunctionsHostBuilder/KafkaTrigger.cs b/samples/azure-functions/service-bus-kafka/ASBS_5/AzureFunctions.KafkaTrigger.FunctionsHostBuilder/KafkaTrigger.cs index 316a7aa6044..307e45a7f29 100644 --- a/samples/azure-functions/service-bus-kafka/ASBS_5/AzureFunctions.KafkaTrigger.FunctionsHostBuilder/KafkaTrigger.cs +++ b/samples/azure-functions/service-bus-kafka/ASBS_5/AzureFunctions.KafkaTrigger.FunctionsHostBuilder/KafkaTrigger.cs @@ -1,24 +1,18 @@ -using Microsoft.Azure.Functions.Worker; -using Microsoft.Extensions.Logging; -using NServiceBus; -using System.Threading.Tasks; +using System.Text.Json.Nodes; using AzureFunctions.Messages.NServiceBusMessages; -using System.Text.Json.Nodes; +using Microsoft.Azure.Functions.Worker; +using Microsoft.Extensions.Logging; namespace AzureFunctions.KafkaTrigger.FunctionsHostBuilder; public class KafkaTrigger(IMessageSession messageSession, ILogger logger) { - readonly IMessageSession messageSession = messageSession; - readonly ILogger logger = logger; - #region KafkaTrigger [Function(nameof(ElectricityUsage))] public async Task ElectricityUsage([KafkaTrigger("LocalKafkaBroker", "topic", ConsumerGroup = "$Default")] string eventData, FunctionContext context) { - var eventValue = JsonNode.Parse(eventData)["Value"]?.ToString(); var electricityUsage = Messages.KafkaMessages.ElectricityUsage.Deserialize(eventValue); diff --git a/samples/azure-functions/service-bus-kafka/ASBS_5/AzureFunctions.KafkaTrigger.FunctionsHostBuilder/Program.cs b/samples/azure-functions/service-bus-kafka/ASBS_5/AzureFunctions.KafkaTrigger.FunctionsHostBuilder/Program.cs index 67857c6d77e..25cd8bc1509 100644 --- a/samples/azure-functions/service-bus-kafka/ASBS_5/AzureFunctions.KafkaTrigger.FunctionsHostBuilder/Program.cs +++ b/samples/azure-functions/service-bus-kafka/ASBS_5/AzureFunctions.KafkaTrigger.FunctionsHostBuilder/Program.cs @@ -1,41 +1,29 @@ -using System; -using System.Threading.Tasks; -using AzureFunctions.Messages.NServiceBusMessages; +using AzureFunctions.Messages.NServiceBusMessages; +using Microsoft.Azure.Functions.Worker.Builder; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; -using NServiceBus; -namespace AzureFunctions.KafkaTrigger.FunctionsHostBuilder; +#region SetupNServiceBusSendOnly -public class Program -{ - public static async Task Main() - { - #region SetupNServiceBusSendOnly +var builder = FunctionsApplication.CreateBuilder(args); - var host = new HostBuilder() - .ConfigureServices(async services => - { - var cfg = new EndpointConfiguration("SendOnly"); - cfg.SendOnly(); - cfg.UseSerialization(); +var cfg = new EndpointConfiguration("SendOnly"); +cfg.SendOnly(); +cfg.UseSerialization(); - var connectionString = Environment.GetEnvironmentVariable("AzureWebJobsServiceBus"); - var transport = new AzureServiceBusTransport(connectionString, TopicTopology.Default); - var routing = cfg.UseTransport(transport); +var connectionString = Environment.GetEnvironmentVariable("AzureWebJobsServiceBus"); +var transport = new AzureServiceBusTransport(connectionString, TopicTopology.Default); +var routing = cfg.UseTransport(transport); - routing.RouteToEndpoint(typeof(FollowUp), "Samples.KafkaTrigger.ConsoleEndpoint"); +routing.RouteToEndpoint(typeof(FollowUp), "Samples.KafkaTrigger.ConsoleEndpoint"); - var endpoint = await Endpoint.Start(cfg); +var endpoint = await Endpoint.Start(cfg); - // Inject the endpoint in the DI container - services.AddSingleton(endpoint); - }) - .ConfigureFunctionsWorkerDefaults() - .Build(); +// Inject the endpoint in the DI container +builder.Services.AddSingleton(endpoint); - #endregion +var host = builder.Build(); - await host.RunAsync(); - } -} \ No newline at end of file +#endregion + +await host.RunAsync(); \ No newline at end of file diff --git a/samples/azure-functions/service-bus-kafka/ASBS_5/AzureFunctions.KafkaTrigger.FunctionsHostBuilder/host.json b/samples/azure-functions/service-bus-kafka/ASBS_5/AzureFunctions.KafkaTrigger.FunctionsHostBuilder/host.json index 9e6ce8c54c9..610d7e0ac7a 100644 --- a/samples/azure-functions/service-bus-kafka/ASBS_5/AzureFunctions.KafkaTrigger.FunctionsHostBuilder/host.json +++ b/samples/azure-functions/service-bus-kafka/ASBS_5/AzureFunctions.KafkaTrigger.FunctionsHostBuilder/host.json @@ -1,8 +1,8 @@ { "version": "2.0", "extensions": { - "ServiceBus": { - "EnableCrossEntityTransactions": true + "serviceBus": { + "enableCrossEntityTransactions": true } } } \ No newline at end of file diff --git a/samples/azure-functions/service-bus-kafka/ASBS_5/AzureFunctions.Messages/AzureFunctions.Messages.csproj b/samples/azure-functions/service-bus-kafka/ASBS_5/AzureFunctions.Messages/AzureFunctions.Messages.csproj index 72aec1f4abf..6ba4680348d 100644 --- a/samples/azure-functions/service-bus-kafka/ASBS_5/AzureFunctions.Messages/AzureFunctions.Messages.csproj +++ b/samples/azure-functions/service-bus-kafka/ASBS_5/AzureFunctions.Messages/AzureFunctions.Messages.csproj @@ -1,9 +1,12 @@ + net9.0;net8.0 12.0 + + \ No newline at end of file diff --git a/samples/azure-functions/service-bus-kafka/ASBS_5/AzureFunctions.Messages/FollowUp.cs b/samples/azure-functions/service-bus-kafka/ASBS_5/AzureFunctions.Messages/FollowUp.cs index 4403282bf8b..067896374a7 100644 --- a/samples/azure-functions/service-bus-kafka/ASBS_5/AzureFunctions.Messages/FollowUp.cs +++ b/samples/azure-functions/service-bus-kafka/ASBS_5/AzureFunctions.Messages/FollowUp.cs @@ -5,6 +5,8 @@ namespace AzureFunctions.Messages.NServiceBusMessages; public class FollowUp : IMessage { public int CustomerId { get; set; } + public int UnitId { get; set; } + public string Description { get; set; } } \ No newline at end of file diff --git a/samples/azure-functions/service-bus-kafka/ASBS_5/AzureFunctions.Messages/KafkaMessages/ElectricityUsage.cs b/samples/azure-functions/service-bus-kafka/ASBS_5/AzureFunctions.Messages/KafkaMessages/ElectricityUsage.cs index 0d0ceb394fd..2e2ce465a49 100644 --- a/samples/azure-functions/service-bus-kafka/ASBS_5/AzureFunctions.Messages/KafkaMessages/ElectricityUsage.cs +++ b/samples/azure-functions/service-bus-kafka/ASBS_5/AzureFunctions.Messages/KafkaMessages/ElectricityUsage.cs @@ -5,7 +5,9 @@ namespace AzureFunctions.Messages.KafkaMessages; public class ElectricityUsage { public int CustomerId { get; set; } + public int UnitId { get; set; } + public int CurrentUsage { get; set; } public static string Serialize(ElectricityUsage electricityUsage) diff --git a/samples/azure-functions/service-bus-kafka/ASBS_5/ConsoleEndpoint/Program.cs b/samples/azure-functions/service-bus-kafka/ASBS_5/ConsoleEndpoint/Program.cs index 926daeeb7e7..ca295046510 100644 --- a/samples/azure-functions/service-bus-kafka/ASBS_5/ConsoleEndpoint/Program.cs +++ b/samples/azure-functions/service-bus-kafka/ASBS_5/ConsoleEndpoint/Program.cs @@ -1,72 +1,65 @@ using AzureFunctions.Messages.KafkaMessages; using Confluent.Kafka; -using NServiceBus; -class Program -{ - static async Task Main() - { - const string endpointName = "Samples.KafkaTrigger.ConsoleEndpoint"; - Console.Title = endpointName; +const string endpointName = "Samples.KafkaTrigger.ConsoleEndpoint"; +Console.Title = endpointName; - var endpointConfiguration = new EndpointConfiguration(endpointName); - endpointConfiguration.EnableInstallers(); - endpointConfiguration.UseSerialization(); +var endpointConfiguration = new EndpointConfiguration(endpointName); +endpointConfiguration.EnableInstallers(); +endpointConfiguration.UseSerialization(); - var connectionString = Environment.GetEnvironmentVariable("AzureServiceBus_ConnectionString"); - if (string.IsNullOrWhiteSpace(connectionString)) - { - throw new Exception("Could not read the 'AzureServiceBus_ConnectionString' environment variable. Check the sample prerequisites."); - } +var connectionString = Environment.GetEnvironmentVariable("AzureServiceBus_ConnectionString"); +if (string.IsNullOrWhiteSpace(connectionString)) +{ + throw new Exception("Could not read the 'AzureServiceBus_ConnectionString' environment variable. Check the sample prerequisites."); +} - var transport = new AzureServiceBusTransport(connectionString, TopicTopology.Default); - endpointConfiguration.UseTransport(transport); +var transport = new AzureServiceBusTransport(connectionString, TopicTopology.Default); +endpointConfiguration.UseTransport(transport); - var endpointInstance = await Endpoint.Start(endpointConfiguration); +var endpointInstance = await Endpoint.Start(endpointConfiguration); - var config = new ProducerConfig - { - BootstrapServers = "localhost:9094", - ClientId = "producer-1", - BatchSize = 50 - }; +var config = new ProducerConfig +{ + BootstrapServers = "localhost:9094", + ClientId = "producer-1", + BatchSize = 50 +}; - Console.WriteLine("Press '[enter]' to send a 100 events using Kafka and wait for a possible response..."); - Console.WriteLine("Press any other key to exit"); +Console.WriteLine("Press '[enter]' to send a 100 events using Kafka and wait for a possible response..."); +Console.WriteLine("Press any other key to exit"); - using (var producer = new ProducerBuilder(config) - .Build()) - { - while (true) - { - var key = Console.ReadKey(); - Console.WriteLine(); - - if (key.Key != ConsoleKey.Enter) - { - break; - } +using (var producer = new ProducerBuilder(config) + .Build()) +{ + while (true) + { + var key = Console.ReadKey(); + Console.WriteLine(); - for (int i = 0; i < 100; i++) - { - #region ProduceEvent + if (key.Key != ConsoleKey.Enter) + { + break; + } - var electricityUsage = new ElectricityUsage() { CustomerId = 42, CurrentUsage = i, UnitId = 1337 }; + for (int i = 0; i < 100; i++) + { + #region ProduceEvent - var message = new Message - { - Value = ElectricityUsage.Serialize(electricityUsage) - }; + var electricityUsage = new ElectricityUsage() { CustomerId = 42, CurrentUsage = i, UnitId = 1337 }; - var deliveryResult = await producer.ProduceAsync("myKafkaTopic", message); + var message = new Message + { + Value = ElectricityUsage.Serialize(electricityUsage) + }; - #endregion - } + var deliveryResult = await producer.ProduceAsync("myKafkaTopic", message); - Console.WriteLine("100 messages sent"); - } + #endregion } - await endpointInstance.Stop(); + Console.WriteLine("100 messages sent"); } -} \ No newline at end of file +} + +await endpointInstance.Stop(); \ No newline at end of file diff --git a/samples/azure-functions/service-bus-kafka/ASBS_6/.run/Everything.run.xml b/samples/azure-functions/service-bus-kafka/ASBS_6/.run/Everything.run.xml new file mode 100644 index 00000000000..04581b1dd0a --- /dev/null +++ b/samples/azure-functions/service-bus-kafka/ASBS_6/.run/Everything.run.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/samples/azure-functions/service-bus-kafka/ASBS_6/AzureFunctions-Kafka.StartupProjects.txt b/samples/azure-functions/service-bus-kafka/ASBS_6/AzureFunctions-Kafka.StartupProjects.txt new file mode 100644 index 00000000000..8c2a0262bff --- /dev/null +++ b/samples/azure-functions/service-bus-kafka/ASBS_6/AzureFunctions-Kafka.StartupProjects.txt @@ -0,0 +1,2 @@ +AzureFunctions.KafkaTrigger.FunctionsHostBuilder\AzureFunctions.KafkaTrigger.FunctionsHostBuilder.csproj +ConsoleEndpoint\ConsoleEndpoint.csproj \ No newline at end of file diff --git a/samples/azure-functions/service-bus-kafka/ASBS_6/AzureFunctions-Kafka.sln b/samples/azure-functions/service-bus-kafka/ASBS_6/AzureFunctions-Kafka.sln new file mode 100644 index 00000000000..a07dba312fd --- /dev/null +++ b/samples/azure-functions/service-bus-kafka/ASBS_6/AzureFunctions-Kafka.sln @@ -0,0 +1,64 @@ +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.29728.190 +MinimumVisualStudioVersion = 15.0.26730.12 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AzureFunctions.Messages", "AzureFunctions.Messages\AzureFunctions.Messages.csproj", "{8EB0DD38-EF11-4C6E-A8F6-9128463D22B9}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AzureFunctions.KafkaTrigger.FunctionsHostBuilder", "AzureFunctions.KafkaTrigger.FunctionsHostBuilder\AzureFunctions.KafkaTrigger.FunctionsHostBuilder.csproj", "{D3C0429A-08D8-41B0-B51A-F31A047959BD}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConsoleEndpoint", "ConsoleEndpoint\ConsoleEndpoint.csproj", "{A2800EC9-AB77-4CDB-A620-224295A10951}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {8EB0DD38-EF11-4C6E-A8F6-9128463D22B9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8EB0DD38-EF11-4C6E-A8F6-9128463D22B9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8EB0DD38-EF11-4C6E-A8F6-9128463D22B9}.Debug|x64.ActiveCfg = Debug|Any CPU + {8EB0DD38-EF11-4C6E-A8F6-9128463D22B9}.Debug|x64.Build.0 = Debug|Any CPU + {8EB0DD38-EF11-4C6E-A8F6-9128463D22B9}.Debug|x86.ActiveCfg = Debug|Any CPU + {8EB0DD38-EF11-4C6E-A8F6-9128463D22B9}.Debug|x86.Build.0 = Debug|Any CPU + {8EB0DD38-EF11-4C6E-A8F6-9128463D22B9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8EB0DD38-EF11-4C6E-A8F6-9128463D22B9}.Release|Any CPU.Build.0 = Release|Any CPU + {8EB0DD38-EF11-4C6E-A8F6-9128463D22B9}.Release|x64.ActiveCfg = Release|Any CPU + {8EB0DD38-EF11-4C6E-A8F6-9128463D22B9}.Release|x64.Build.0 = Release|Any CPU + {8EB0DD38-EF11-4C6E-A8F6-9128463D22B9}.Release|x86.ActiveCfg = Release|Any CPU + {8EB0DD38-EF11-4C6E-A8F6-9128463D22B9}.Release|x86.Build.0 = Release|Any CPU + {D3C0429A-08D8-41B0-B51A-F31A047959BD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D3C0429A-08D8-41B0-B51A-F31A047959BD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D3C0429A-08D8-41B0-B51A-F31A047959BD}.Debug|x64.ActiveCfg = Debug|Any CPU + {D3C0429A-08D8-41B0-B51A-F31A047959BD}.Debug|x64.Build.0 = Debug|Any CPU + {D3C0429A-08D8-41B0-B51A-F31A047959BD}.Debug|x86.ActiveCfg = Debug|Any CPU + {D3C0429A-08D8-41B0-B51A-F31A047959BD}.Debug|x86.Build.0 = Debug|Any CPU + {D3C0429A-08D8-41B0-B51A-F31A047959BD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D3C0429A-08D8-41B0-B51A-F31A047959BD}.Release|Any CPU.Build.0 = Release|Any CPU + {D3C0429A-08D8-41B0-B51A-F31A047959BD}.Release|x64.ActiveCfg = Release|Any CPU + {D3C0429A-08D8-41B0-B51A-F31A047959BD}.Release|x64.Build.0 = Release|Any CPU + {D3C0429A-08D8-41B0-B51A-F31A047959BD}.Release|x86.ActiveCfg = Release|Any CPU + {D3C0429A-08D8-41B0-B51A-F31A047959BD}.Release|x86.Build.0 = Release|Any CPU + {A2800EC9-AB77-4CDB-A620-224295A10951}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A2800EC9-AB77-4CDB-A620-224295A10951}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A2800EC9-AB77-4CDB-A620-224295A10951}.Debug|x64.ActiveCfg = Debug|Any CPU + {A2800EC9-AB77-4CDB-A620-224295A10951}.Debug|x64.Build.0 = Debug|Any CPU + {A2800EC9-AB77-4CDB-A620-224295A10951}.Debug|x86.ActiveCfg = Debug|Any CPU + {A2800EC9-AB77-4CDB-A620-224295A10951}.Debug|x86.Build.0 = Debug|Any CPU + {A2800EC9-AB77-4CDB-A620-224295A10951}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A2800EC9-AB77-4CDB-A620-224295A10951}.Release|Any CPU.Build.0 = Release|Any CPU + {A2800EC9-AB77-4CDB-A620-224295A10951}.Release|x64.ActiveCfg = Release|Any CPU + {A2800EC9-AB77-4CDB-A620-224295A10951}.Release|x64.Build.0 = Release|Any CPU + {A2800EC9-AB77-4CDB-A620-224295A10951}.Release|x86.ActiveCfg = Release|Any CPU + {A2800EC9-AB77-4CDB-A620-224295A10951}.Release|x86.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {6C66C18C-5075-4811-AF40-2997E8863F3B} + EndGlobalSection +EndGlobal diff --git a/samples/azure-functions/service-bus-kafka/ASBS_6/AzureFunctions.KafkaTrigger.FunctionsHostBuilder/AzureFunctions.KafkaTrigger.FunctionsHostBuilder.csproj b/samples/azure-functions/service-bus-kafka/ASBS_6/AzureFunctions.KafkaTrigger.FunctionsHostBuilder/AzureFunctions.KafkaTrigger.FunctionsHostBuilder.csproj new file mode 100644 index 00000000000..b9bb30d249e --- /dev/null +++ b/samples/azure-functions/service-bus-kafka/ASBS_6/AzureFunctions.KafkaTrigger.FunctionsHostBuilder/AzureFunctions.KafkaTrigger.FunctionsHostBuilder.csproj @@ -0,0 +1,28 @@ + + + + net10.0 + Exe + v4 + enable + 14.0 + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/samples/azure-functions/service-bus-kafka/ASBS_6/AzureFunctions.KafkaTrigger.FunctionsHostBuilder/KafkaTrigger.cs b/samples/azure-functions/service-bus-kafka/ASBS_6/AzureFunctions.KafkaTrigger.FunctionsHostBuilder/KafkaTrigger.cs new file mode 100644 index 00000000000..307e45a7f29 --- /dev/null +++ b/samples/azure-functions/service-bus-kafka/ASBS_6/AzureFunctions.KafkaTrigger.FunctionsHostBuilder/KafkaTrigger.cs @@ -0,0 +1,42 @@ +using System.Text.Json.Nodes; +using AzureFunctions.Messages.NServiceBusMessages; +using Microsoft.Azure.Functions.Worker; +using Microsoft.Extensions.Logging; + +namespace AzureFunctions.KafkaTrigger.FunctionsHostBuilder; + +public class KafkaTrigger(IMessageSession messageSession, ILogger logger) +{ + #region KafkaTrigger + + [Function(nameof(ElectricityUsage))] + public async Task ElectricityUsage([KafkaTrigger("LocalKafkaBroker", "topic", ConsumerGroup = "$Default")] string eventData, + FunctionContext context) + { + var eventValue = JsonNode.Parse(eventData)["Value"]?.ToString(); + var electricityUsage = Messages.KafkaMessages.ElectricityUsage.Deserialize(eventValue); + + logger.LogInformation("Received Kafka event with usage: {CurrentUsage}", electricityUsage.CurrentUsage); + + if (IsUsageAboveAverage(electricityUsage.CurrentUsage)) + { + var message = new FollowUp + { + CustomerId = electricityUsage.CustomerId, + UnitId = electricityUsage.UnitId, + Description = $"Usage over monthly average at [{electricityUsage.CurrentUsage}] units" + }; + + await messageSession.Send(message); + } + } + + #endregion + + // Because Kafka is an event stream, more messages arrive there than we might be able to handle with + // Azure ServiceBus. For demo purposes an alert is raised at the exact usage of 42. + static bool IsUsageAboveAverage(int currentUsage) + { + return currentUsage == 42; + } +} \ No newline at end of file diff --git a/samples/azure-functions/service-bus-kafka/ASBS_6/AzureFunctions.KafkaTrigger.FunctionsHostBuilder/Program.cs b/samples/azure-functions/service-bus-kafka/ASBS_6/AzureFunctions.KafkaTrigger.FunctionsHostBuilder/Program.cs new file mode 100644 index 00000000000..25cd8bc1509 --- /dev/null +++ b/samples/azure-functions/service-bus-kafka/ASBS_6/AzureFunctions.KafkaTrigger.FunctionsHostBuilder/Program.cs @@ -0,0 +1,29 @@ +using AzureFunctions.Messages.NServiceBusMessages; +using Microsoft.Azure.Functions.Worker.Builder; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; + +#region SetupNServiceBusSendOnly + +var builder = FunctionsApplication.CreateBuilder(args); + +var cfg = new EndpointConfiguration("SendOnly"); +cfg.SendOnly(); +cfg.UseSerialization(); + +var connectionString = Environment.GetEnvironmentVariable("AzureWebJobsServiceBus"); +var transport = new AzureServiceBusTransport(connectionString, TopicTopology.Default); +var routing = cfg.UseTransport(transport); + +routing.RouteToEndpoint(typeof(FollowUp), "Samples.KafkaTrigger.ConsoleEndpoint"); + +var endpoint = await Endpoint.Start(cfg); + +// Inject the endpoint in the DI container +builder.Services.AddSingleton(endpoint); + +var host = builder.Build(); + +#endregion + +await host.RunAsync(); \ No newline at end of file diff --git a/samples/azure-functions/service-bus-kafka/ASBS_6/AzureFunctions.KafkaTrigger.FunctionsHostBuilder/host.json b/samples/azure-functions/service-bus-kafka/ASBS_6/AzureFunctions.KafkaTrigger.FunctionsHostBuilder/host.json new file mode 100644 index 00000000000..610d7e0ac7a --- /dev/null +++ b/samples/azure-functions/service-bus-kafka/ASBS_6/AzureFunctions.KafkaTrigger.FunctionsHostBuilder/host.json @@ -0,0 +1,8 @@ +{ + "version": "2.0", + "extensions": { + "serviceBus": { + "enableCrossEntityTransactions": true + } + } +} \ No newline at end of file diff --git a/samples/azure-functions/service-bus-kafka/ASBS_6/AzureFunctions.Messages/AzureFunctions.Messages.csproj b/samples/azure-functions/service-bus-kafka/ASBS_6/AzureFunctions.Messages/AzureFunctions.Messages.csproj new file mode 100644 index 00000000000..477f6b613c9 --- /dev/null +++ b/samples/azure-functions/service-bus-kafka/ASBS_6/AzureFunctions.Messages/AzureFunctions.Messages.csproj @@ -0,0 +1,12 @@ + + + + net10.0 + 14.0 + + + + + + + \ No newline at end of file diff --git a/samples/azure-functions/service-bus-kafka/ASBS_6/AzureFunctions.Messages/FollowUp.cs b/samples/azure-functions/service-bus-kafka/ASBS_6/AzureFunctions.Messages/FollowUp.cs new file mode 100644 index 00000000000..067896374a7 --- /dev/null +++ b/samples/azure-functions/service-bus-kafka/ASBS_6/AzureFunctions.Messages/FollowUp.cs @@ -0,0 +1,12 @@ +using NServiceBus; + +namespace AzureFunctions.Messages.NServiceBusMessages; + +public class FollowUp : IMessage +{ + public int CustomerId { get; set; } + + public int UnitId { get; set; } + + public string Description { get; set; } +} \ No newline at end of file diff --git a/samples/azure-functions/service-bus-kafka/ASBS_6/AzureFunctions.Messages/KafkaMessages/ElectricityUsage.cs b/samples/azure-functions/service-bus-kafka/ASBS_6/AzureFunctions.Messages/KafkaMessages/ElectricityUsage.cs new file mode 100644 index 00000000000..2e2ce465a49 --- /dev/null +++ b/samples/azure-functions/service-bus-kafka/ASBS_6/AzureFunctions.Messages/KafkaMessages/ElectricityUsage.cs @@ -0,0 +1,22 @@ +using System.Text.Json; + +namespace AzureFunctions.Messages.KafkaMessages; + +public class ElectricityUsage +{ + public int CustomerId { get; set; } + + public int UnitId { get; set; } + + public int CurrentUsage { get; set; } + + public static string Serialize(ElectricityUsage electricityUsage) + { + return JsonSerializer.Serialize(electricityUsage); + } + + public static ElectricityUsage Deserialize(string value) + { + return JsonSerializer.Deserialize(value); + } +} \ No newline at end of file diff --git a/samples/azure-functions/service-bus-kafka/ASBS_6/ConsoleEndpoint/ConsoleEndpoint.csproj b/samples/azure-functions/service-bus-kafka/ASBS_6/ConsoleEndpoint/ConsoleEndpoint.csproj new file mode 100644 index 00000000000..2a33af3d8b3 --- /dev/null +++ b/samples/azure-functions/service-bus-kafka/ASBS_6/ConsoleEndpoint/ConsoleEndpoint.csproj @@ -0,0 +1,20 @@ + + + + net10.0 + Exe + enable + enable + 14.0 + + + + + + + + + + + + diff --git a/samples/azure-functions/service-bus-kafka/ASBS_6/ConsoleEndpoint/Handlers/FollowUpHandler.cs b/samples/azure-functions/service-bus-kafka/ASBS_6/ConsoleEndpoint/Handlers/FollowUpHandler.cs new file mode 100644 index 00000000000..b226ef22b34 --- /dev/null +++ b/samples/azure-functions/service-bus-kafka/ASBS_6/ConsoleEndpoint/Handlers/FollowUpHandler.cs @@ -0,0 +1,14 @@ +using AzureFunctions.Messages.NServiceBusMessages; +using NServiceBus; + +namespace ConsoleEndpoint.Handlers; + +public class FollowUpHandler : IHandleMessages +{ + public Task Handle(FollowUp message, IMessageHandlerContext context) + { + Console.WriteLine($"User [{message.CustomerId}] for unit [{message.UnitId}] has message: {message.Description}"); + + return Task.CompletedTask; + } +} \ No newline at end of file diff --git a/samples/azure-functions/service-bus-kafka/ASBS_6/ConsoleEndpoint/Program.cs b/samples/azure-functions/service-bus-kafka/ASBS_6/ConsoleEndpoint/Program.cs new file mode 100644 index 00000000000..ca295046510 --- /dev/null +++ b/samples/azure-functions/service-bus-kafka/ASBS_6/ConsoleEndpoint/Program.cs @@ -0,0 +1,65 @@ +using AzureFunctions.Messages.KafkaMessages; +using Confluent.Kafka; + +const string endpointName = "Samples.KafkaTrigger.ConsoleEndpoint"; +Console.Title = endpointName; + +var endpointConfiguration = new EndpointConfiguration(endpointName); +endpointConfiguration.EnableInstallers(); +endpointConfiguration.UseSerialization(); + +var connectionString = Environment.GetEnvironmentVariable("AzureServiceBus_ConnectionString"); +if (string.IsNullOrWhiteSpace(connectionString)) +{ + throw new Exception("Could not read the 'AzureServiceBus_ConnectionString' environment variable. Check the sample prerequisites."); +} + +var transport = new AzureServiceBusTransport(connectionString, TopicTopology.Default); +endpointConfiguration.UseTransport(transport); + +var endpointInstance = await Endpoint.Start(endpointConfiguration); + +var config = new ProducerConfig +{ + BootstrapServers = "localhost:9094", + ClientId = "producer-1", + BatchSize = 50 +}; + +Console.WriteLine("Press '[enter]' to send a 100 events using Kafka and wait for a possible response..."); +Console.WriteLine("Press any other key to exit"); + +using (var producer = new ProducerBuilder(config) + .Build()) +{ + while (true) + { + var key = Console.ReadKey(); + Console.WriteLine(); + + if (key.Key != ConsoleKey.Enter) + { + break; + } + + for (int i = 0; i < 100; i++) + { + #region ProduceEvent + + var electricityUsage = new ElectricityUsage() { CustomerId = 42, CurrentUsage = i, UnitId = 1337 }; + + var message = new Message + { + Value = ElectricityUsage.Serialize(electricityUsage) + }; + + var deliveryResult = await producer.ProduceAsync("myKafkaTopic", message); + + #endregion + } + + Console.WriteLine("100 messages sent"); + } +} + +await endpointInstance.Stop(); \ No newline at end of file diff --git a/samples/azure-functions/service-bus-kafka/ASBS_6/docker-compose.yml b/samples/azure-functions/service-bus-kafka/ASBS_6/docker-compose.yml new file mode 100644 index 00000000000..4d46bb46e46 --- /dev/null +++ b/samples/azure-functions/service-bus-kafka/ASBS_6/docker-compose.yml @@ -0,0 +1,21 @@ +version: "3" +services: + kafka: + image: "docker.io/bitnami/kafka:3.5" + hostname: kafka + ports: + - "9092:9092" + - '9094:9094' + environment: + # KRaft settings + - KAFKA_CFG_NODE_ID=0 + - KAFKA_CFG_PROCESS_ROLES=controller,broker + - KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=0@kafka:9093 + # Listeners + - KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093,EXTERNAL://:9094 + - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://:9092,EXTERNAL://localhost:9094 + - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,EXTERNAL:PLAINTEXT,PLAINTEXT:PLAINTEXT + - KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER + - KAFKA_CFG_INTER_BROKER_LISTENER_NAME=PLAINTEXT + # Memory + - KAFKA_HEAP_OPTS=-Xmx512M -Xms512M diff --git a/samples/azure-functions/service-bus-kafka/ASBS_6/local.settings.json b/samples/azure-functions/service-bus-kafka/ASBS_6/local.settings.json new file mode 100644 index 00000000000..fbadfbed888 --- /dev/null +++ b/samples/azure-functions/service-bus-kafka/ASBS_6/local.settings.json @@ -0,0 +1,10 @@ +{ + "IsEncrypted": false, + "Values": { + "AzureWebJobsStorage": "UseDevelopmentStorage=true", + "FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated", + "LocalKafkaBroker": "localhost:9094", + "topic": "myKafkaTopic", + "AzureWebJobsServiceBus": "" + } +} \ No newline at end of file diff --git a/samples/azure-functions/service-bus-kafka/ASBS_6/prerelease.txt b/samples/azure-functions/service-bus-kafka/ASBS_6/prerelease.txt new file mode 100644 index 00000000000..e69de29bb2d diff --git a/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_4/AzureFunctions.ASBTrigger.Worker/AzureFunctions.ASBTrigger.Worker.csproj b/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_4/AzureFunctions.ASBTrigger.Worker/AzureFunctions.ASBTrigger.Worker.csproj index 526b55de289..b489e3959fe 100644 --- a/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_4/AzureFunctions.ASBTrigger.Worker/AzureFunctions.ASBTrigger.Worker.csproj +++ b/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_4/AzureFunctions.ASBTrigger.Worker/AzureFunctions.ASBTrigger.Worker.csproj @@ -1,21 +1,27 @@  + net9.0;net8.0 v4 Exe + enable 12.0 + + + + + - + - - - + + diff --git a/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_4/AzureFunctions.ASBTrigger.Worker/FollowupMessageHandler.cs b/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_4/AzureFunctions.ASBTrigger.Worker/FollowupMessageHandler.cs index c5bd0796b4b..fa0454b7d38 100644 --- a/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_4/AzureFunctions.ASBTrigger.Worker/FollowupMessageHandler.cs +++ b/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_4/AzureFunctions.ASBTrigger.Worker/FollowupMessageHandler.cs @@ -1,5 +1,4 @@ -using System.Threading.Tasks; -using NServiceBus; +using NServiceBus; using NServiceBus.Logging; #region FollowupMessageHandler diff --git a/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_4/AzureFunctions.ASBTrigger.Worker/HttpSender.cs b/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_4/AzureFunctions.ASBTrigger.Worker/HttpSender.cs index 7872928de29..37785ad0113 100644 --- a/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_4/AzureFunctions.ASBTrigger.Worker/HttpSender.cs +++ b/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_4/AzureFunctions.ASBTrigger.Worker/HttpSender.cs @@ -1,20 +1,11 @@ using System.Net; -using System.Threading.Tasks; using Microsoft.Azure.Functions.Worker; using Microsoft.Azure.Functions.Worker.Http; using Microsoft.Extensions.Logging; using NServiceBus; - -class HttpSender +class HttpSender(IFunctionEndpoint functionEndpoint) { - readonly IFunctionEndpoint functionEndpoint; - - public HttpSender(IFunctionEndpoint functionEndpoint) - { - this.functionEndpoint = functionEndpoint; - } - [Function("HttpSender")] public async Task Run( [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequestData req, diff --git a/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_4/AzureFunctions.ASBTrigger.Worker/Program.cs b/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_4/AzureFunctions.ASBTrigger.Worker/Program.cs index cc4e9583f45..d3889ce7928 100644 --- a/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_4/AzureFunctions.ASBTrigger.Worker/Program.cs +++ b/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_4/AzureFunctions.ASBTrigger.Worker/Program.cs @@ -1,20 +1,13 @@ using Microsoft.Extensions.Hosting; using NServiceBus; -using System.Threading.Tasks; #region configuration-with-function-host-builder -[assembly:NServiceBusTriggerFunction("ASBWorkerEndpoint")] +[assembly: NServiceBusTriggerFunction("ASBWorkerEndpoint")] -public class Program -{ - public static Task Main() - { - var host = new HostBuilder() - .ConfigureFunctionsWorkerDefaults() - .UseNServiceBus() - .Build(); +var host = new HostBuilder() + .ConfigureFunctionsWorkerDefaults() + .UseNServiceBus() + .Build(); - return host.RunAsync(); - } -} +await host.RunAsync(); #endregion \ No newline at end of file diff --git a/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_4/AzureFunctions.ASBTrigger.Worker/TriggerMessageHandler.cs b/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_4/AzureFunctions.ASBTrigger.Worker/TriggerMessageHandler.cs index 9c9a34bb501..29e93c5bd71 100644 --- a/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_4/AzureFunctions.ASBTrigger.Worker/TriggerMessageHandler.cs +++ b/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_4/AzureFunctions.ASBTrigger.Worker/TriggerMessageHandler.cs @@ -1,5 +1,4 @@ -using System.Threading.Tasks; -using NServiceBus; +using NServiceBus; using NServiceBus.Logging; #region TriggerMessageHandler diff --git a/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_4/AzureFunctions.ASBTrigger.Worker/local.settings.json b/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_4/AzureFunctions.ASBTrigger.Worker/local.settings.json index e211dc9a699..887fa5787c4 100644 --- a/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_4/AzureFunctions.ASBTrigger.Worker/local.settings.json +++ b/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_4/AzureFunctions.ASBTrigger.Worker/local.settings.json @@ -3,7 +3,6 @@ "Values": { "AzureWebJobsStorage": "UseDevelopmentStorage=true", "FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated", - "AzureWebJobsServiceBus": "" } } \ No newline at end of file diff --git a/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_4/AzureFunctions.Messages/AzureFunctions.Messages.csproj b/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_4/AzureFunctions.Messages/AzureFunctions.Messages.csproj index 05b765b0196..bda5b7c20bf 100644 --- a/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_4/AzureFunctions.Messages/AzureFunctions.Messages.csproj +++ b/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_4/AzureFunctions.Messages/AzureFunctions.Messages.csproj @@ -1,9 +1,13 @@ + net9.0;net8.0 + enable 12.0 + + \ No newline at end of file diff --git a/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_4/AzureFunctions.Messages/FollowupMessage.cs b/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_4/AzureFunctions.Messages/FollowupMessage.cs index ced2b6650e0..24e6e670710 100644 --- a/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_4/AzureFunctions.Messages/FollowupMessage.cs +++ b/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_4/AzureFunctions.Messages/FollowupMessage.cs @@ -1,5 +1 @@ -using NServiceBus; - -public class FollowupMessage : IMessage -{ -} \ No newline at end of file +public class FollowupMessage : IMessage; \ No newline at end of file diff --git a/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_4/AzureFunctions.Messages/TriggerMessage.cs b/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_4/AzureFunctions.Messages/TriggerMessage.cs index cb463023124..c18a35c3b33 100644 --- a/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_4/AzureFunctions.Messages/TriggerMessage.cs +++ b/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_4/AzureFunctions.Messages/TriggerMessage.cs @@ -1,5 +1 @@ -using NServiceBus; - -public class TriggerMessage : IMessage -{ -} \ No newline at end of file +public class TriggerMessage : IMessage; \ No newline at end of file diff --git a/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_5/AzureFunctions.ASBTrigger.Worker/AzureFunctions.ASBTrigger.Worker.csproj b/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_5/AzureFunctions.ASBTrigger.Worker/AzureFunctions.ASBTrigger.Worker.csproj index 81f75f29656..3be22782330 100644 --- a/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_5/AzureFunctions.ASBTrigger.Worker/AzureFunctions.ASBTrigger.Worker.csproj +++ b/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_5/AzureFunctions.ASBTrigger.Worker/AzureFunctions.ASBTrigger.Worker.csproj @@ -1,21 +1,27 @@ + net9.0;net8.0 v4 Exe + enable 12.0 + + + + + - + - - - + + diff --git a/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_5/AzureFunctions.ASBTrigger.Worker/FollowupMessageHandler.cs b/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_5/AzureFunctions.ASBTrigger.Worker/FollowupMessageHandler.cs index c5bd0796b4b..b8b79b0821a 100644 --- a/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_5/AzureFunctions.ASBTrigger.Worker/FollowupMessageHandler.cs +++ b/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_5/AzureFunctions.ASBTrigger.Worker/FollowupMessageHandler.cs @@ -1,6 +1,4 @@ -using System.Threading.Tasks; -using NServiceBus; -using NServiceBus.Logging; +using NServiceBus.Logging; #region FollowupMessageHandler diff --git a/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_5/AzureFunctions.ASBTrigger.Worker/HttpSender.cs b/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_5/AzureFunctions.ASBTrigger.Worker/HttpSender.cs index 7872928de29..185710bcf0d 100644 --- a/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_5/AzureFunctions.ASBTrigger.Worker/HttpSender.cs +++ b/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_5/AzureFunctions.ASBTrigger.Worker/HttpSender.cs @@ -1,20 +1,10 @@ using System.Net; -using System.Threading.Tasks; using Microsoft.Azure.Functions.Worker; using Microsoft.Azure.Functions.Worker.Http; using Microsoft.Extensions.Logging; -using NServiceBus; - -class HttpSender +class HttpSender(IFunctionEndpoint functionEndpoint) { - readonly IFunctionEndpoint functionEndpoint; - - public HttpSender(IFunctionEndpoint functionEndpoint) - { - this.functionEndpoint = functionEndpoint; - } - [Function("HttpSender")] public async Task Run( [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequestData req, diff --git a/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_5/AzureFunctions.ASBTrigger.Worker/Program.cs b/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_5/AzureFunctions.ASBTrigger.Worker/Program.cs index cc4e9583f45..986ab246fb5 100644 --- a/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_5/AzureFunctions.ASBTrigger.Worker/Program.cs +++ b/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_5/AzureFunctions.ASBTrigger.Worker/Program.cs @@ -1,20 +1,12 @@ using Microsoft.Extensions.Hosting; -using NServiceBus; -using System.Threading.Tasks; #region configuration-with-function-host-builder -[assembly:NServiceBusTriggerFunction("ASBWorkerEndpoint")] +[assembly: NServiceBusTriggerFunction("ASBWorkerEndpoint")] -public class Program -{ - public static Task Main() - { - var host = new HostBuilder() - .ConfigureFunctionsWorkerDefaults() - .UseNServiceBus() - .Build(); +var host = new HostBuilder() + .ConfigureFunctionsWorkerDefaults() + .UseNServiceBus() + .Build(); - return host.RunAsync(); - } -} +await host.RunAsync(); #endregion \ No newline at end of file diff --git a/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_5/AzureFunctions.ASBTrigger.Worker/TriggerMessageHandler.cs b/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_5/AzureFunctions.ASBTrigger.Worker/TriggerMessageHandler.cs index 9c9a34bb501..d8e5d25ac2a 100644 --- a/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_5/AzureFunctions.ASBTrigger.Worker/TriggerMessageHandler.cs +++ b/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_5/AzureFunctions.ASBTrigger.Worker/TriggerMessageHandler.cs @@ -1,6 +1,4 @@ -using System.Threading.Tasks; -using NServiceBus; -using NServiceBus.Logging; +using NServiceBus.Logging; #region TriggerMessageHandler diff --git a/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_5/AzureFunctions.ASBTrigger.Worker/local.settings.json b/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_5/AzureFunctions.ASBTrigger.Worker/local.settings.json index e211dc9a699..887fa5787c4 100644 --- a/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_5/AzureFunctions.ASBTrigger.Worker/local.settings.json +++ b/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_5/AzureFunctions.ASBTrigger.Worker/local.settings.json @@ -3,7 +3,6 @@ "Values": { "AzureWebJobsStorage": "UseDevelopmentStorage=true", "FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated", - "AzureWebJobsServiceBus": "" } } \ No newline at end of file diff --git a/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_5/AzureFunctions.Messages/AzureFunctions.Messages.csproj b/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_5/AzureFunctions.Messages/AzureFunctions.Messages.csproj index 72aec1f4abf..6c47b6d7476 100644 --- a/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_5/AzureFunctions.Messages/AzureFunctions.Messages.csproj +++ b/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_5/AzureFunctions.Messages/AzureFunctions.Messages.csproj @@ -1,9 +1,13 @@ + net9.0;net8.0 + enable 12.0 + + \ No newline at end of file diff --git a/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_5/AzureFunctions.Messages/FollowupMessage.cs b/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_5/AzureFunctions.Messages/FollowupMessage.cs index ced2b6650e0..73b9b5614ce 100644 --- a/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_5/AzureFunctions.Messages/FollowupMessage.cs +++ b/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_5/AzureFunctions.Messages/FollowupMessage.cs @@ -1,5 +1 @@ -using NServiceBus; - -public class FollowupMessage : IMessage -{ -} \ No newline at end of file +public class FollowupMessage : IMessage; diff --git a/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_5/AzureFunctions.Messages/TriggerMessage.cs b/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_5/AzureFunctions.Messages/TriggerMessage.cs index cb463023124..c18a35c3b33 100644 --- a/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_5/AzureFunctions.Messages/TriggerMessage.cs +++ b/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_5/AzureFunctions.Messages/TriggerMessage.cs @@ -1,5 +1 @@ -using NServiceBus; - -public class TriggerMessage : IMessage -{ -} \ No newline at end of file +public class TriggerMessage : IMessage; \ No newline at end of file diff --git a/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_6/AzureFunctions.ASBTrigger.Worker/AzureFunctions.ASBTrigger.Worker.csproj b/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_6/AzureFunctions.ASBTrigger.Worker/AzureFunctions.ASBTrigger.Worker.csproj index 6673cba97b6..e83d954fe07 100644 --- a/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_6/AzureFunctions.ASBTrigger.Worker/AzureFunctions.ASBTrigger.Worker.csproj +++ b/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_6/AzureFunctions.ASBTrigger.Worker/AzureFunctions.ASBTrigger.Worker.csproj @@ -1,21 +1,27 @@ + net9.0;net8.0 v4 Exe + enable 12.0 + + + + + - - - - + + + diff --git a/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_6/AzureFunctions.ASBTrigger.Worker/FollowupMessageHandler.cs b/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_6/AzureFunctions.ASBTrigger.Worker/FollowupMessageHandler.cs index 682e680d5c4..b1140bb6843 100644 --- a/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_6/AzureFunctions.ASBTrigger.Worker/FollowupMessageHandler.cs +++ b/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_6/AzureFunctions.ASBTrigger.Worker/FollowupMessageHandler.cs @@ -1,12 +1,9 @@ -using System.Threading.Tasks; -using Microsoft.Extensions.Logging; -using NServiceBus; +using Microsoft.Extensions.Logging; #region FollowupMessageHandler public class FollowupMessageHandler(ILogger logger) : IHandleMessages { - public Task Handle(FollowupMessage message, IMessageHandlerContext context) { logger.LogWarning("Handling {MessageType} in {HandlerType}.", nameof(FollowupMessage), nameof(FollowupMessageHandler)); diff --git a/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_6/AzureFunctions.ASBTrigger.Worker/HttpSender.cs b/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_6/AzureFunctions.ASBTrigger.Worker/HttpSender.cs index 700943bee70..185710bcf0d 100644 --- a/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_6/AzureFunctions.ASBTrigger.Worker/HttpSender.cs +++ b/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_6/AzureFunctions.ASBTrigger.Worker/HttpSender.cs @@ -1,10 +1,7 @@ using System.Net; -using System.Threading.Tasks; using Microsoft.Azure.Functions.Worker; using Microsoft.Azure.Functions.Worker.Http; using Microsoft.Extensions.Logging; -using NServiceBus; - class HttpSender(IFunctionEndpoint functionEndpoint) { diff --git a/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_6/AzureFunctions.ASBTrigger.Worker/Program.cs b/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_6/AzureFunctions.ASBTrigger.Worker/Program.cs index e27c90f6e01..d343f0634af 100644 --- a/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_6/AzureFunctions.ASBTrigger.Worker/Program.cs +++ b/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_6/AzureFunctions.ASBTrigger.Worker/Program.cs @@ -1,22 +1,12 @@ using Microsoft.Extensions.Hosting; -using NServiceBus; -using System.Threading.Tasks; -using Microsoft.Extensions.DependencyInjection; -using NServiceBus.Transport.AzureServiceBus; #region configuration-with-function-host-builder -[assembly:NServiceBusTriggerFunction("ASBWorkerEndpoint")] +[assembly: NServiceBusTriggerFunction("ASBWorkerEndpoint")] -public class Program -{ - public static Task Main() - { - var host = new HostBuilder() - .ConfigureFunctionsWorkerDefaults() - .UseNServiceBus() - .Build(); +var host = new HostBuilder() + .ConfigureFunctionsWorkerDefaults() + .UseNServiceBus() + .Build(); - return host.RunAsync(); - } -} +await host.RunAsync(); #endregion \ No newline at end of file diff --git a/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_6/AzureFunctions.ASBTrigger.Worker/TriggerMessageHandler.cs b/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_6/AzureFunctions.ASBTrigger.Worker/TriggerMessageHandler.cs index 97a640958ee..dc76ce67580 100644 --- a/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_6/AzureFunctions.ASBTrigger.Worker/TriggerMessageHandler.cs +++ b/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_6/AzureFunctions.ASBTrigger.Worker/TriggerMessageHandler.cs @@ -1,6 +1,4 @@ -using System.Threading.Tasks; -using Microsoft.Extensions.Logging; -using NServiceBus; +using Microsoft.Extensions.Logging; #region TriggerMessageHandler diff --git a/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_6/AzureFunctions.ASBTrigger.Worker/local.settings.json b/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_6/AzureFunctions.ASBTrigger.Worker/local.settings.json index 417caabadf3..887fa5787c4 100644 --- a/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_6/AzureFunctions.ASBTrigger.Worker/local.settings.json +++ b/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_6/AzureFunctions.ASBTrigger.Worker/local.settings.json @@ -3,6 +3,6 @@ "Values": { "AzureWebJobsStorage": "UseDevelopmentStorage=true", "FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated", - "AzureWebJobsServiceBus": "", + "AzureWebJobsServiceBus": "" } } \ No newline at end of file diff --git a/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_6/AzureFunctions.Messages/AzureFunctions.Messages.csproj b/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_6/AzureFunctions.Messages/AzureFunctions.Messages.csproj index 72aec1f4abf..6c47b6d7476 100644 --- a/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_6/AzureFunctions.Messages/AzureFunctions.Messages.csproj +++ b/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_6/AzureFunctions.Messages/AzureFunctions.Messages.csproj @@ -1,9 +1,13 @@ + net9.0;net8.0 + enable 12.0 + + \ No newline at end of file diff --git a/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_6/AzureFunctions.Messages/FollowupMessage.cs b/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_6/AzureFunctions.Messages/FollowupMessage.cs index 19d20705878..24e6e670710 100644 --- a/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_6/AzureFunctions.Messages/FollowupMessage.cs +++ b/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_6/AzureFunctions.Messages/FollowupMessage.cs @@ -1,3 +1 @@ -using NServiceBus; - -public class FollowupMessage : IMessage; \ No newline at end of file +public class FollowupMessage : IMessage; \ No newline at end of file diff --git a/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_6/AzureFunctions.Messages/TriggerMessage.cs b/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_6/AzureFunctions.Messages/TriggerMessage.cs index d08a1b561be..c18a35c3b33 100644 --- a/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_6/AzureFunctions.Messages/TriggerMessage.cs +++ b/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_6/AzureFunctions.Messages/TriggerMessage.cs @@ -1,3 +1 @@ -using NServiceBus; - -public class TriggerMessage : IMessage; \ No newline at end of file +public class TriggerMessage : IMessage; \ No newline at end of file diff --git a/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_7/AzureFunctions.ASBTrigger.Worker/AzureFunctions.ASBTrigger.Worker.csproj b/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_7/AzureFunctions.ASBTrigger.Worker/AzureFunctions.ASBTrigger.Worker.csproj new file mode 100644 index 00000000000..cb23b0291e2 --- /dev/null +++ b/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_7/AzureFunctions.ASBTrigger.Worker/AzureFunctions.ASBTrigger.Worker.csproj @@ -0,0 +1,27 @@ + + + + net10.0 + v4 + Exe + enable + 14.0 + + + + + + + + + + + + + + + + + + + diff --git a/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_7/AzureFunctions.ASBTrigger.Worker/FollowupMessageHandler.cs b/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_7/AzureFunctions.ASBTrigger.Worker/FollowupMessageHandler.cs new file mode 100644 index 00000000000..b1140bb6843 --- /dev/null +++ b/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_7/AzureFunctions.ASBTrigger.Worker/FollowupMessageHandler.cs @@ -0,0 +1,14 @@ +using Microsoft.Extensions.Logging; + +#region FollowupMessageHandler + +public class FollowupMessageHandler(ILogger logger) : IHandleMessages +{ + public Task Handle(FollowupMessage message, IMessageHandlerContext context) + { + logger.LogWarning("Handling {MessageType} in {HandlerType}.", nameof(FollowupMessage), nameof(FollowupMessageHandler)); + return Task.CompletedTask; + } +} + +#endregion \ No newline at end of file diff --git a/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_7/AzureFunctions.ASBTrigger.Worker/HttpSender.cs b/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_7/AzureFunctions.ASBTrigger.Worker/HttpSender.cs new file mode 100644 index 00000000000..185710bcf0d --- /dev/null +++ b/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_7/AzureFunctions.ASBTrigger.Worker/HttpSender.cs @@ -0,0 +1,25 @@ +using System.Net; +using Microsoft.Azure.Functions.Worker; +using Microsoft.Azure.Functions.Worker.Http; +using Microsoft.Extensions.Logging; + +class HttpSender(IFunctionEndpoint functionEndpoint) +{ + [Function("HttpSender")] + public async Task Run( + [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequestData req, + FunctionContext executionContext) + { + var logger = executionContext.GetLogger(); + logger.LogInformation("C# HTTP trigger function received a request."); + + var sendOptions = new SendOptions(); + sendOptions.RouteToThisEndpoint(); + + await functionEndpoint.Send(new TriggerMessage(), sendOptions, executionContext); + + var r = req.CreateResponse(HttpStatusCode.OK); + await r.WriteStringAsync($"{nameof(TriggerMessage)} sent."); + return r; + } +} diff --git a/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_7/AzureFunctions.ASBTrigger.Worker/Program.cs b/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_7/AzureFunctions.ASBTrigger.Worker/Program.cs new file mode 100644 index 00000000000..d343f0634af --- /dev/null +++ b/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_7/AzureFunctions.ASBTrigger.Worker/Program.cs @@ -0,0 +1,12 @@ +using Microsoft.Extensions.Hosting; + +#region configuration-with-function-host-builder +[assembly: NServiceBusTriggerFunction("ASBWorkerEndpoint")] + +var host = new HostBuilder() + .ConfigureFunctionsWorkerDefaults() + .UseNServiceBus() + .Build(); + +await host.RunAsync(); +#endregion \ No newline at end of file diff --git a/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_7/AzureFunctions.ASBTrigger.Worker/TriggerMessageHandler.cs b/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_7/AzureFunctions.ASBTrigger.Worker/TriggerMessageHandler.cs new file mode 100644 index 00000000000..dc76ce67580 --- /dev/null +++ b/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_7/AzureFunctions.ASBTrigger.Worker/TriggerMessageHandler.cs @@ -0,0 +1,16 @@ +using Microsoft.Extensions.Logging; + +#region TriggerMessageHandler + +public class TriggerMessageHandler(ILogger logger) : IHandleMessages +{ + + public Task Handle(TriggerMessage message, IMessageHandlerContext context) + { + logger.LogWarning("Handling {MessageType} in {HandlerType}", nameof(TriggerMessage), nameof(TriggerMessageHandler)); + + return context.SendLocal(new FollowupMessage()); + } +} + +#endregion \ No newline at end of file diff --git a/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_7/AzureFunctions.ASBTrigger.Worker/host.json b/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_7/AzureFunctions.ASBTrigger.Worker/host.json new file mode 100644 index 00000000000..b9f92c0dee3 --- /dev/null +++ b/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_7/AzureFunctions.ASBTrigger.Worker/host.json @@ -0,0 +1,3 @@ +{ + "version": "2.0" +} \ No newline at end of file diff --git a/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_7/AzureFunctions.ASBTrigger.Worker/local.settings.json b/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_7/AzureFunctions.ASBTrigger.Worker/local.settings.json new file mode 100644 index 00000000000..887fa5787c4 --- /dev/null +++ b/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_7/AzureFunctions.ASBTrigger.Worker/local.settings.json @@ -0,0 +1,8 @@ +{ + "IsEncrypted": false, + "Values": { + "AzureWebJobsStorage": "UseDevelopmentStorage=true", + "FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated", + "AzureWebJobsServiceBus": "" + } +} \ No newline at end of file diff --git a/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_7/AzureFunctions.Messages/AzureFunctions.Messages.csproj b/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_7/AzureFunctions.Messages/AzureFunctions.Messages.csproj new file mode 100644 index 00000000000..84465a06ae1 --- /dev/null +++ b/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_7/AzureFunctions.Messages/AzureFunctions.Messages.csproj @@ -0,0 +1,13 @@ + + + + net10.0 + enable + 14.0 + + + + + + + \ No newline at end of file diff --git a/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_7/AzureFunctions.Messages/FollowupMessage.cs b/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_7/AzureFunctions.Messages/FollowupMessage.cs new file mode 100644 index 00000000000..24e6e670710 --- /dev/null +++ b/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_7/AzureFunctions.Messages/FollowupMessage.cs @@ -0,0 +1 @@ +public class FollowupMessage : IMessage; \ No newline at end of file diff --git a/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_7/AzureFunctions.Messages/TriggerMessage.cs b/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_7/AzureFunctions.Messages/TriggerMessage.cs new file mode 100644 index 00000000000..c18a35c3b33 --- /dev/null +++ b/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_7/AzureFunctions.Messages/TriggerMessage.cs @@ -0,0 +1 @@ +public class TriggerMessage : IMessage; \ No newline at end of file diff --git a/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_7/AzureFunctionsWorker-ASB.sln b/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_7/AzureFunctionsWorker-ASB.sln new file mode 100644 index 00000000000..e659aedde00 --- /dev/null +++ b/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_7/AzureFunctionsWorker-ASB.sln @@ -0,0 +1,31 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.31624.102 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AzureFunctions.ASBTrigger.Worker", "AzureFunctions.ASBTrigger.Worker\AzureFunctions.ASBTrigger.Worker.csproj", "{A31F8C23-7BC6-4EF0-851E-C6294DB774D6}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AzureFunctions.Messages", "AzureFunctions.Messages\AzureFunctions.Messages.csproj", "{6A678428-0512-47AF-A2B8-BD5084CD7493}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {A31F8C23-7BC6-4EF0-851E-C6294DB774D6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A31F8C23-7BC6-4EF0-851E-C6294DB774D6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A31F8C23-7BC6-4EF0-851E-C6294DB774D6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A31F8C23-7BC6-4EF0-851E-C6294DB774D6}.Release|Any CPU.Build.0 = Release|Any CPU + {6A678428-0512-47AF-A2B8-BD5084CD7493}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6A678428-0512-47AF-A2B8-BD5084CD7493}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6A678428-0512-47AF-A2B8-BD5084CD7493}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6A678428-0512-47AF-A2B8-BD5084CD7493}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {8F152D3C-160A-49E8-8323-365D464AEBCD} + EndGlobalSection +EndGlobal diff --git a/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_7/prerelease.txt b/samples/azure-functions/service-bus-worker/ASBFunctionsWorker_7/prerelease.txt new file mode 100644 index 00000000000..e69de29bb2d