我正在尝试使timout政策正常运行。集成api时,我有以下要求。
对于此任务,我想使用Polly,在我看来这是一个很棒的组件,可帮助处理瞬态故障。但是,由于我对这项技术还很陌生,所以我只想确定自己是否正确实施。
首先,我像这样用Polly创建了一个超时策略
var timeoutPolicy =
Policy.TimeoutAsync(
TimeSpan.FromSeconds( 20 ),
TimeoutStrategy.Optimistic,
async ( context, timespan, task ) => {
//write here the cancel request
} );
Run Code Online (Sandbox Code Playgroud)
然后,我准备执行该策略
var policyResult = await timeoutPolicy.ExecuteAndCaptureAsync( async () => {
//make here the request 1
} );
Run Code Online (Sandbox Code Playgroud)
我从文档中得到的是,如果在timeoutPolicy.ExecuteAndCaptureAsync委托内部发生了超时,则Polly会自动调用onTimeout委托。对?
但是我的问题是:
朋友们,我有一个关于围绕 SQL 命令的执行实施简单重试策略的问题。
我的问题是:重试循环应该封装连接和事务的构造,还是应该存在于连接中。
例如:
private void RetryLogSave(DynamicParameters parameters, int retries = 3)
{
int tries = 0;
using (var connection = new SqlConnection(_connectionString))
{
connection.Open();
using (var transaction = connection.BeginTransaction())
{
var logItemCommand = new CommandDefinition(commandText: Constants.InsertLogItem,
parameters: parameters, transaction: transaction, commandType: System.Data.CommandType.Text);
do
{
try
{
tries++;
connection.Execute(logItemCommand);
transaction.Commit();
break;
}
catch (Exception exc)
{
if (tries == retries)
{
transaction.Rollback();
throw exc;
}
Task.Delay(100 * tries).Wait();
}
}
while (true);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我在这里所做的是否合适且可以接受,或者重试逻辑是否应该存在于 SqlConnection 构造的外部?