Add request start without waiting for result
This commit is contained in:
@ -24,5 +24,23 @@ namespace Hcs.Broker.Api.Request.NsiCommon
|
||||
|
||||
return result.Item as NsiItemType;
|
||||
}
|
||||
|
||||
internal async Task<string> SendAsync(int registryNumber, ListGroup listGroup, CancellationToken token)
|
||||
{
|
||||
// http://open-gkh.ru/NsiCommon/exportNsiItemRequest.html
|
||||
var request = new exportNsiItemRequest
|
||||
{
|
||||
Id = Constants.SIGNED_XML_ELEMENT_ID,
|
||||
version = "10.0.1.2",
|
||||
RegistryNumber = registryNumber.ToString(),
|
||||
ListGroup = listGroup
|
||||
};
|
||||
|
||||
return await StartSendAsync(request, async asyncClient =>
|
||||
{
|
||||
var response = await asyncClient.exportNsiItemAsync(CreateRequestHeader(), request);
|
||||
return response.AckRequest.Ack;
|
||||
}, token);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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);
|
||||
|
||||
Reference in New Issue
Block a user