diff --git a/src/Quidjibo.Aws.Sqs/Factories/SqsWorkProviderFactory.cs b/src/Quidjibo.Aws.Sqs/Factories/SqsWorkProviderFactory.cs index 86a97b4..33481b9 100644 --- a/src/Quidjibo.Aws.Sqs/Factories/SqsWorkProviderFactory.cs +++ b/src/Quidjibo.Aws.Sqs/Factories/SqsWorkProviderFactory.cs @@ -3,6 +3,7 @@ using System.Threading; using System.Threading.Tasks; using Amazon.SQS; +using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.Logging; using Quidjibo.Aws.Sqs.Configurations; using Quidjibo.Aws.Sqs.Providers; @@ -13,8 +14,10 @@ namespace Quidjibo.Aws.Sqs.Factories { public class SqsWorkProviderFactory : IWorkProviderFactory { + private readonly MemoryCache _providerCache = new MemoryCache(new MemoryCacheOptions()); private readonly ILoggerFactory _loggerFactory; private readonly SqsQuidjiboConfiguration _sqsQuidjiboConfiguration; + private readonly AmazonSQSClient _client; public SqsWorkProviderFactory( ILoggerFactory loggerFactory, @@ -22,34 +25,36 @@ public SqsWorkProviderFactory( { _loggerFactory = loggerFactory; _sqsQuidjiboConfiguration = sqsQuidjiboConfiguration; + _client = new AmazonSQSClient(_sqsQuidjiboConfiguration.Credentials, _sqsQuidjiboConfiguration.AmazonSqsConfig); } - public async Task CreateAsync(string queues, CancellationToken cancellationToken = default(CancellationToken)) + public Task CreateAsync(string queues, CancellationToken cancellationToken = default(CancellationToken)) { - var client = new AmazonSQSClient(_sqsQuidjiboConfiguration.Credentials, _sqsQuidjiboConfiguration.AmazonSqsConfig); - var response = await client.GetQueueUrlAsync(queues, cancellationToken); - if (response.HttpStatusCode != HttpStatusCode.OK) + return _providerCache.GetOrCreateAsync(queues, async e => { - throw new InvalidOperationException("Could not load the queues url."); - } - - var provider = new SqsWorkProvider( - _loggerFactory.CreateLogger(), - client, - response.QueueUrl, - _sqsQuidjiboConfiguration.Type, - _sqsQuidjiboConfiguration.LockInterval, - _sqsQuidjiboConfiguration.BatchSize, - _sqsQuidjiboConfiguration.LongPollDuration); + var response = await _client.GetQueueUrlAsync(queues, cancellationToken); + if (response.HttpStatusCode != HttpStatusCode.OK) + { + throw new InvalidOperationException("Could not load the queues url."); + } - return provider; + var provider = new SqsWorkProvider( + _loggerFactory.CreateLogger(), + _client, + response.QueueUrl, + _sqsQuidjiboConfiguration.Type, + _sqsQuidjiboConfiguration.LockInterval, + _sqsQuidjiboConfiguration.BatchSize, + _sqsQuidjiboConfiguration.LongPollDuration); + return (IWorkProvider)provider; + }); } public Task CreateAsync(string[] queues, CancellationToken cancellationToken = default(CancellationToken)) { if (queues.Length != 1) { - throw new NotSupportedException("Each queues requires a seperate listener. Please pass a single queue."); + throw new NotSupportedException("Each queues requires a separate listener. Please pass a single queue."); } return CreateAsync(queues[0], cancellationToken); diff --git a/src/Quidjibo.Aws.Sqs/Quidjibo.Aws.Sqs.csproj b/src/Quidjibo.Aws.Sqs/Quidjibo.Aws.Sqs.csproj index 292ca7e..1123fb8 100644 --- a/src/Quidjibo.Aws.Sqs/Quidjibo.Aws.Sqs.csproj +++ b/src/Quidjibo.Aws.Sqs/Quidjibo.Aws.Sqs.csproj @@ -18,8 +18,9 @@ - - + + +