Added ExecutionKey into PolicyWrap and remove COncurrentDictioanry
This commit is contained in:
parent
44ac659e32
commit
aa8e943ba9
@ -3,7 +3,6 @@ using Newtonsoft.Json;
|
|||||||
using Polly;
|
using Polly;
|
||||||
using Polly.Wrap;
|
using Polly.Wrap;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Concurrent;
|
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Net;
|
using System.Net;
|
||||||
@ -20,18 +19,15 @@ namespace Microsoft.eShopOnContainers.BuildingBlocks.Resilience.Http
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class ResilientHttpClient : IHttpClient
|
public class ResilientHttpClient : IHttpClient
|
||||||
{
|
{
|
||||||
private HttpClient _client;
|
private readonly HttpClient _client;
|
||||||
private readonly ConcurrentDictionary<string, PolicyWrap> _policiesPerOrigin;
|
private readonly ILogger<ResilientHttpClient> _logger;
|
||||||
private ILogger<ResilientHttpClient> _logger;
|
private PolicyWrap _policyWrap;
|
||||||
private readonly Func<string, IEnumerable<Policy>> _policyCreator;
|
|
||||||
|
|
||||||
|
public ResilientHttpClient(IEnumerable<Policy> policies, ILogger<ResilientHttpClient> logger)
|
||||||
public ResilientHttpClient(Func<string, IEnumerable<Policy>> policyCreator, ILogger<ResilientHttpClient> logger)
|
|
||||||
{
|
{
|
||||||
_client = new HttpClient();
|
_client = new HttpClient();
|
||||||
_logger = logger;
|
_logger = logger;
|
||||||
_policiesPerOrigin = new ConcurrentDictionary<string, PolicyWrap>();
|
_policyWrap = Policy.Wrap(policies.ToArray());
|
||||||
_policyCreator = policyCreator;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -128,36 +124,15 @@ namespace Microsoft.eShopOnContainers.BuildingBlocks.Resilience.Http
|
|||||||
}
|
}
|
||||||
|
|
||||||
private Task<T> HttpInvoker<T>(string origin, Func<Task<T>> action)
|
private Task<T> HttpInvoker<T>(string origin, Func<Task<T>> action)
|
||||||
{
|
|
||||||
var policyWrapper = GetPolicyForOrigin(origin);
|
|
||||||
|
|
||||||
if (policyWrapper != null)
|
|
||||||
{
|
|
||||||
// Executes the action applying all
|
|
||||||
// the policies defined in the wrapper
|
|
||||||
return policyWrapper.ExecuteAsync(() => action());
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
throw new InvalidOperationException($"PolicyWrapper can't be created for origin {origin}");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private PolicyWrap GetPolicyForOrigin(string origin)
|
|
||||||
{
|
{
|
||||||
var normalizedOrigin = NormalizeOrigin(origin);
|
var normalizedOrigin = NormalizeOrigin(origin);
|
||||||
|
|
||||||
if (!_policiesPerOrigin.TryGetValue(normalizedOrigin, out PolicyWrap policyWrapper))
|
// Executes the action applying all
|
||||||
{
|
// the policies defined in the wrapper
|
||||||
policyWrapper = Policy.WrapAsync(_policyCreator(normalizedOrigin)
|
return _policyWrap.ExecuteAsync(() => action(), new Context(normalizedOrigin));
|
||||||
.ToArray());
|
|
||||||
|
|
||||||
_policiesPerOrigin.TryAdd(normalizedOrigin, policyWrapper);
|
|
||||||
}
|
|
||||||
|
|
||||||
return policyWrapper;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private static string NormalizeOrigin(string origin)
|
private static string NormalizeOrigin(string origin)
|
||||||
{
|
{
|
||||||
return origin?.Trim()?.ToLower();
|
return origin?.Trim()?.ToLower();
|
||||||
|
@ -17,7 +17,7 @@ namespace Microsoft.eShopOnContainers.WebMVC.Infrastructure
|
|||||||
=>_logger = logger;
|
=>_logger = logger;
|
||||||
|
|
||||||
public ResilientHttpClient CreateResilientHttpClient()
|
public ResilientHttpClient CreateResilientHttpClient()
|
||||||
=> new ResilientHttpClient((origin) => CreatePolicies(), _logger);
|
=> new ResilientHttpClient(CreatePolicies(), _logger);
|
||||||
|
|
||||||
|
|
||||||
private Policy[] CreatePolicies()
|
private Policy[] CreatePolicies()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user