diff --git a/sdk/eventhub/Microsoft.Azure.WebJobs.Extensions.EventHubs/src/Config/EventHubWebJobsBuilderExtensions.cs b/sdk/eventhub/Microsoft.Azure.WebJobs.Extensions.EventHubs/src/Config/EventHubWebJobsBuilderExtensions.cs index d8d817dac687..00d250385ec8 100644 --- a/sdk/eventhub/Microsoft.Azure.WebJobs.Extensions.EventHubs/src/Config/EventHubWebJobsBuilderExtensions.cs +++ b/sdk/eventhub/Microsoft.Azure.WebJobs.Extensions.EventHubs/src/Config/EventHubWebJobsBuilderExtensions.cs @@ -2,6 +2,7 @@ // Licensed under the MIT License. See License.txt in the project root for license information. using System; +using System.Linq; using System.Net; using Azure.Messaging.EventHubs.Consumer; using Microsoft.Azure.WebJobs; @@ -94,9 +95,16 @@ public static IWebJobsBuilder AddEventHubs(this IWebJobsBuilder builder, Action< internal static IWebJobsBuilder AddEventHubsScaleForTrigger(this IWebJobsBuilder builder, TriggerMetadata triggerMetadata) { - builder.Services.AddSingleton(serviceProvider => new EventHubsScalerProvider(serviceProvider, triggerMetadata)); - builder.Services.AddSingleton(serviceProvider => serviceProvider.GetRequiredService()); - builder.Services.AddSingleton(serviceProvider => serviceProvider.GetRequiredService()); + // We need to register an instance of EventHubsScalerProvider in the DI container and then map it to the interfaces IScaleMonitorProvider and ITargetScalerProvider. + // Since there can be more than one instance of EventHubsScalerProvider, we have to store a reference to the created instance to filter it out later. + EventHubsScalerProvider eventHubsScalerProvider = null; + builder.Services.AddSingleton(serviceProvider => + { + eventHubsScalerProvider = new EventHubsScalerProvider(serviceProvider, triggerMetadata); + return eventHubsScalerProvider ; + }); + builder.Services.AddSingleton(serviceProvider => serviceProvider.GetServices().Single(x => x == eventHubsScalerProvider )); + builder.Services.AddSingleton(serviceProvider => serviceProvider.GetServices().Single(x => x == eventHubsScalerProvider )); return builder; } diff --git a/sdk/eventhub/Microsoft.Azure.WebJobs.Extensions.EventHubs/tests/ScaleHostEndToEndTests.cs b/sdk/eventhub/Microsoft.Azure.WebJobs.Extensions.EventHubs/tests/ScaleHostEndToEndTests.cs index caa9b8e786bb..b2f85d8a5385 100644 --- a/sdk/eventhub/Microsoft.Azure.WebJobs.Extensions.EventHubs/tests/ScaleHostEndToEndTests.cs +++ b/sdk/eventhub/Microsoft.Azure.WebJobs.Extensions.EventHubs/tests/ScaleHostEndToEndTests.cs @@ -54,7 +54,6 @@ public ScaleHostEndToEndTests() : base() } [Test] - [Ignore("Consistently failing in CI; caused by #38673")] [TestCase(false)] [TestCase(true)] public async Task ScaleHostEndToEndTest(bool tbsEnabled) diff --git a/sdk/servicebus/Microsoft.Azure.WebJobs.Extensions.ServiceBus/src/Config/ServiceBusHostBuilderExtensions.cs b/sdk/servicebus/Microsoft.Azure.WebJobs.Extensions.ServiceBus/src/Config/ServiceBusHostBuilderExtensions.cs index a4a710617f04..39e4ce40db9a 100644 --- a/sdk/servicebus/Microsoft.Azure.WebJobs.Extensions.ServiceBus/src/Config/ServiceBusHostBuilderExtensions.cs +++ b/sdk/servicebus/Microsoft.Azure.WebJobs.Extensions.ServiceBus/src/Config/ServiceBusHostBuilderExtensions.cs @@ -2,6 +2,7 @@ // Licensed under the MIT License. See License.txt in the project root for license information. using System; +using System.Linq; using System.Net; using Microsoft.Azure.WebJobs; using Microsoft.Azure.WebJobs.Extensions.ServiceBus.Config; @@ -108,9 +109,15 @@ public static IWebJobsBuilder AddServiceBus(this IWebJobsBuilder builder, Action internal static IWebJobsBuilder AddServiceBusScaleForTrigger(this IWebJobsBuilder builder, TriggerMetadata triggerMetadata) { - builder.Services.AddSingleton(serviceProvider => new ServiceBusScalerProvider(serviceProvider, triggerMetadata)); - builder.Services.AddSingleton(serviceProvider => serviceProvider.GetRequiredService()); - builder.Services.AddSingleton(serviceProvider => serviceProvider.GetRequiredService()); + // We need to register an instance of ServiceBusScalerProvider in the DI container and then map it to the interfaces IScaleMonitorProvider and ITargetScalerProvider. + // Since there can be more than one instance of ServiceBusScalerProvider, we have to store a reference to the created instance to filter it out later. + ServiceBusScalerProvider serviceBusScalerProvider = null; + builder.Services.AddSingleton(serviceProvider => { + serviceBusScalerProvider = new ServiceBusScalerProvider(serviceProvider, triggerMetadata); + return serviceBusScalerProvider; + }); + builder.Services.AddSingleton(serviceProvider => serviceProvider.GetServices().Single(x => x == serviceBusScalerProvider)); + builder.Services.AddSingleton(serviceProvider => serviceProvider.GetServices().Single(x => x == serviceBusScalerProvider)); return builder; } diff --git a/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Queues/src/StorageQueuesWebJobsBuilderExtensions.cs b/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Queues/src/StorageQueuesWebJobsBuilderExtensions.cs index b222658baadc..2f4e12739bda 100644 --- a/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Queues/src/StorageQueuesWebJobsBuilderExtensions.cs +++ b/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Queues/src/StorageQueuesWebJobsBuilderExtensions.cs @@ -2,6 +2,7 @@ // Licensed under the MIT License. using System; +using System.Linq; using System.ComponentModel; using Microsoft.Azure.WebJobs; using Microsoft.Azure.WebJobs.Extensions.Storage.Common; @@ -76,9 +77,16 @@ public static IWebJobsBuilder AddAzureStorageQueues(this IWebJobsBuilder builder [EditorBrowsable(EditorBrowsableState.Never)] public static IWebJobsBuilder AddAzureStorageQueuesScaleForTrigger(this IWebJobsBuilder builder, TriggerMetadata triggerMetadata) { - builder.Services.AddSingleton(serviceProvider => new QueueScalerProvider(serviceProvider, triggerMetadata)); - builder.Services.AddSingleton(serviceProvider => serviceProvider.GetRequiredService()); - builder.Services.AddSingleton(serviceProvider => serviceProvider.GetRequiredService()); + // We need to register an instance of QueueScalerProvider in the DI container and then map it to the interfaces IScaleMonitorProvider and ITargetScalerProvider. + // Since there can be more than one instance of QueueScalerProvider, we have to store a reference to the created instance to filter it out later. + QueueScalerProvider serviceBusScalerProvider = null; + builder.Services.AddSingleton(serviceProvider => + { + serviceBusScalerProvider = new QueueScalerProvider(serviceProvider, triggerMetadata); + return serviceBusScalerProvider; + }); + builder.Services.AddSingleton(serviceProvider => serviceProvider.GetServices().Single(x => x == serviceBusScalerProvider)); + builder.Services.AddSingleton(serviceProvider => serviceProvider.GetServices().Single(x => x == serviceBusScalerProvider)); return builder; }