Add request start without waiting for result

This commit is contained in:
2025-10-27 10:44:42 +09:00
parent 9e9845d446
commit 445bfe8273
3 changed files with 77 additions and 2 deletions

View File

@ -149,6 +149,39 @@ namespace Hcs.Broker.Api.Request
}
}
protected async Task<string> StartSendAsync(
object request,
Func<TAsyncClient, Task<TAck>> sender,
CancellationToken token)
{
token.ThrowIfCancellationRequested();
while (true)
{
try
{
if (CanBeRestarted)
{
return await RunRepeatableTaskInsistentlyAsync(
async () => await ExecuteSendAsync(request, sender), token);
}
else
{
return await ExecuteSendAsync(request, sender);
}
}
catch (RestartTimeoutException e)
{
if (!CanBeRestarted)
{
throw new System.Exception("Cannot restart request execution on timeout", e);
}
client.TryLog($"Restarting {request.GetType().Name} request execution...");
}
}
}
/// <summary>
/// Для запросов к серверу которые можно направлять несколько раз, разрешаем
/// серверу аномально отказаться. Предполагается, что здесь мы игнорируем
@ -251,6 +284,29 @@ namespace Hcs.Broker.Api.Request
return result;
}
private async Task<string> ExecuteSendAsync(
object request,
Func<TAsyncClient, Task<TAck>> sender)
{
ArgumentNullException.ThrowIfNull(request);
var version = RequestHelper.GetRequestVersionString(request);
client.TryLog($"Executing request {RemoteAddress.Uri}/{request.GetType().Name} of version {version}...");
TAck ack;
var stopWatch = System.Diagnostics.Stopwatch.StartNew();
using (var asyncClient = CreateAsyncClient())
{
ack = await sender(asyncClient);
}
stopWatch.Stop();
client.TryLog($"Request executed in {stopWatch.ElapsedMilliseconds} ms, result GUID is {ack.MessageGUID}");
return ack.MessageGUID;
}
private TAsyncClient CreateAsyncClient()
{
var asyncClient = (TAsyncClient)Activator.CreateInstance(typeof(TAsyncClient), binding, RemoteAddress);