using System;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using System.Text.Json;
using System.Collections.Generic;
using medical.transfomer.entity;
using Newtonsoft.Json.Linq;
using Polly;
using Polly.Retry;
using Polly.CircuitBreaker;
using Microsoft.Extensions.Logging;
using SqlSugar;
using ReZero.DependencyInjection;
using System.Reflection;
using System.Linq;
using Polly.Timeout;
using System.Threading;
namespace medical.transfomer.business
{
///
/// 医保转换工厂,负责动态转换和HTTP请求处理
///
public class TransformerFactory : IScopeContract
{
private readonly IHttpClientFactory _httpClientFactory;
private readonly ILogger _logger;
private readonly ISqlSugarClient _db;
private readonly ResiliencePipeline _resiliencePipeline;
public TransformerFactory(IHttpClientFactory httpClientFactory, ILogger logger, ISqlSugarClient db)
{
_httpClientFactory = httpClientFactory;
_logger = logger;
_db = db;
// 在Polly 8.x中,我们使用ResiliencePipelineBuilder来创建弹性管道
var pipelineBuilder = new ResiliencePipelineBuilder();
// 添加重试策略
pipelineBuilder.AddRetry(new RetryStrategyOptions
{
ShouldHandle = new PredicateBuilder()
.Handle()
.HandleResult(r => !r.IsSuccessStatusCode),
MaxRetryAttempts = 3,
Delay = TimeSpan.FromSeconds(1),
BackoffType = DelayBackoffType.Exponential,
OnRetry = args =>
{
_logger.LogWarning($"重试第 {args.AttemptNumber} 次,等待 {args.RetryDelay.TotalSeconds} 秒");
return ValueTask.CompletedTask;
}
});
// 添加断路器策略
pipelineBuilder.AddCircuitBreaker(new CircuitBreakerStrategyOptions
{
ShouldHandle = new PredicateBuilder()
.Handle()
.HandleResult(r => !r.IsSuccessStatusCode),
FailureRatio = 0.5, // 50%失败率
MinimumThroughput = 10, // 最小样本数
SamplingDuration = TimeSpan.FromSeconds(30), // 采样时间窗口
BreakDuration = TimeSpan.FromMinutes(1), // 断路时间
OnOpened = args =>
{
_logger.LogError($"断路器已断开,将在 {args.BreakDuration.TotalSeconds} 秒后尝试恢复");
return ValueTask.CompletedTask;
},
OnClosed = _ =>
{
_logger.LogInformation("断路器已关闭,恢复正常操作");
return ValueTask.CompletedTask;
}
});
// 添加超时策略
pipelineBuilder.AddTimeout(TimeSpan.FromSeconds(30));
// 构建弹性管道
_resiliencePipeline = pipelineBuilder.Build();
}
///
/// 根据方法名执行医保交易
///
/// 方法名称
/// 输入数据
/// 处理结果
public async Task