Add request start without waiting for result
This commit is contained in:
@ -36,9 +36,10 @@ namespace Hcs.Broker.Api
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc cref="INsiCommonApi"/>
|
/// <inheritdoc cref="INsiCommonApi"/>
|
||||||
public Task<string> RequestExportNsiItemAsync(int registryNumber, ListGroup listGroup, CancellationToken token = default)
|
public async Task<string> RequestExportNsiItemAsync(int registryNumber, ListGroup listGroup, CancellationToken token = default)
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
var request = new ExportNsiItemRequest(client);
|
||||||
|
return await request.SendAsync(registryNumber, listGroup, token);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -24,5 +24,23 @@ namespace Hcs.Broker.Api.Request.NsiCommon
|
|||||||
|
|
||||||
return result.Item as NsiItemType;
|
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>
|
/// <summary>
|
||||||
/// Для запросов к серверу которые можно направлять несколько раз, разрешаем
|
/// Для запросов к серверу которые можно направлять несколько раз, разрешаем
|
||||||
/// серверу аномально отказаться. Предполагается, что здесь мы игнорируем
|
/// серверу аномально отказаться. Предполагается, что здесь мы игнорируем
|
||||||
@ -251,6 +284,29 @@ namespace Hcs.Broker.Api.Request
|
|||||||
return result;
|
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()
|
private TAsyncClient CreateAsyncClient()
|
||||||
{
|
{
|
||||||
var asyncClient = (TAsyncClient)Activator.CreateInstance(typeof(TAsyncClient), binding, RemoteAddress);
|
var asyncClient = (TAsyncClient)Activator.CreateInstance(typeof(TAsyncClient), binding, RemoteAddress);
|
||||||
|
|||||||
Reference in New Issue
Block a user