-
Notifications
You must be signed in to change notification settings - Fork 4.9k
/
Copy pathStorageQueuesWebJobsBuilderExtensions.cs
84 lines (71 loc) · 3.9 KB
/
StorageQueuesWebJobsBuilderExtensions.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
using System;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Storage.Common;
using Microsoft.Azure.WebJobs.Extensions.Storage.Common.Listeners;
using Microsoft.Azure.WebJobs.Extensions.Storage.Queues;
using Microsoft.Azure.WebJobs.Extensions.Storage.Queues.Config;
using Microsoft.Azure.WebJobs.Extensions.Storage.Queues.Listeners;
using Microsoft.Azure.WebJobs.Extensions.Storage.Queues.Triggers;
using Microsoft.Azure.WebJobs.Host;
using Microsoft.Azure.WebJobs.Host.Queues;
using Microsoft.Azure.WebJobs.Host.Scale;
using Microsoft.Extensions.Azure;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
namespace Microsoft.Extensions.Hosting
{
/// <summary>
/// Extension methods for Storage Queues integration.
/// </summary>
public static class StorageQueuesWebJobsBuilderExtensions
{
/// <summary>
/// Adds the Storage Queues extension to the provided <see cref="IWebJobsBuilder"/>.
/// </summary>
/// <param name="builder">The <see cref="IWebJobsBuilder"/> to configure.</param>
/// <param name="configureQueues">Optional. An action to configure <see cref="QueuesOptions"/>.</param>
public static IWebJobsBuilder AddAzureStorageQueues(this IWebJobsBuilder builder, Action<QueuesOptions> configureQueues = null)
{
builder.Services.AddAzureClientsCore();
builder.Services.TryAddSingleton<SharedQueueWatcher>();
// $$$ Remove this, should be done via DI // TODO (kasobol-msft) check this
builder.Services.TryAddSingleton<ISharedContextProvider, SharedContextProvider>();
builder.Services.TryAddSingleton<QueueServiceClientProvider>();
builder.Services.TryAddSingleton<QueueCausalityManager>();
builder.Services.TryAddSingleton<IContextSetter<IMessageEnqueuedWatcher>>((p) => new ContextAccessor<IMessageEnqueuedWatcher>());
builder.Services.TryAddSingleton((p) => p.GetService<IContextSetter<IMessageEnqueuedWatcher>>() as IContextGetter<IMessageEnqueuedWatcher>);
builder.Services.TryAddSingleton<QueueTriggerAttributeBindingProvider>();
builder.AddExtension<QueuesExtensionConfigProvider>()
.BindOptions<QueuesOptions>();
if (configureQueues != null)
{
builder.Services.Configure<QueuesOptions>(configureQueues);
}
builder.Services.TryAddSingleton<IQueueProcessorFactory, DefaultQueueProcessorFactory>();
builder.Services.AddOptions<QueuesOptions>()
.Configure<IHostingEnvironment>((options, env) =>
{
if (env.IsDevelopment() && options.MaxPollingInterval == QueuePollingIntervals.DefaultMaximum)
{
options.MaxPollingInterval = TimeSpan.FromSeconds(2);
}
});
return builder;
}
/// <summary>
/// Adds the Storage Queues extension to the provided <see cref="IWebJobsBuilder"/>.
/// </summary>
/// <param name="builder"></param>
/// <param name="triggerMetadata">Trigger metadata.</param>
/// <returns></returns>
public static IWebJobsBuilder AddAzureStorageQueuesScaleForTrigger(this IWebJobsBuilder builder, TriggerMetadata triggerMetadata)
{
builder.Services.AddSingleton(serviceProvider => new QueueScalerProvider(serviceProvider, triggerMetadata));
builder.Services.AddSingleton<IScaleMonitorProvider>(serviceProvider => serviceProvider.GetRequiredService<QueueScalerProvider>());
builder.Services.AddSingleton<ITargetScalerProvider>(serviceProvider => serviceProvider.GetRequiredService<QueueScalerProvider>());
return builder;
}
}
}