From 70bd3da72add31ef88cb8f60bdf04ba32caa67ba Mon Sep 17 00:00:00 2001 From: Mindaugas Baltrimas <104827741+mbaltrimas@users.noreply.github.com> Date: Wed, 31 May 2023 09:47:57 +0100 Subject: [PATCH] Spawn new thread for processing echo requests (#396) Signed-off-by: Mindaugas Baltrimas --- .../Services/Http/DestinationAeTitleController.cs | 9 ++++++++- src/InformaticsGateway/Services/Scu/ScuService.cs | 10 +++++++++- src/InformaticsGateway/Services/Scu/ScuWorkRequest.cs | 4 +++- .../Test/Services/Scu/ScuServiceTest.cs | 8 ++++---- 4 files changed, 24 insertions(+), 7 deletions(-) diff --git a/src/InformaticsGateway/Services/Http/DestinationAeTitleController.cs b/src/InformaticsGateway/Services/Http/DestinationAeTitleController.cs index 7d3f685e2..0edc0e592 100644 --- a/src/InformaticsGateway/Services/Http/DestinationAeTitleController.cs +++ b/src/InformaticsGateway/Services/Http/DestinationAeTitleController.cs @@ -115,7 +115,14 @@ public async Task CEcho(string name) return NotFound(); } - var request = new ScuWorkRequest(traceId, RequestType.CEcho, destinationApplicationEntity.HostIp, destinationApplicationEntity.Port, destinationApplicationEntity.AeTitle); + var request = new ScuWorkRequest( + traceId, + RequestType.CEcho, + destinationApplicationEntity.HostIp, + destinationApplicationEntity.Port, + destinationApplicationEntity.AeTitle, + HttpContext.RequestAborted + ); var response = await _scuQueue.Queue(request, HttpContext.RequestAborted).ConfigureAwait(false); if (response.Status != ResponseStatus.Success) diff --git a/src/InformaticsGateway/Services/Scu/ScuService.cs b/src/InformaticsGateway/Services/Scu/ScuService.cs index 5154139f8..6ca72f240 100644 --- a/src/InformaticsGateway/Services/Scu/ScuService.cs +++ b/src/InformaticsGateway/Services/Scu/ScuService.cs @@ -64,7 +64,10 @@ private async Task BackgroundProcessingAsync(CancellationToken cancellationToken try { var item = _workQueue.Dequeue(cancellationToken); - await Process(item, cancellationToken).ConfigureAwait(false); + + var linkedCancellationToken = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, item.CancellationToken); + + ProcessThread(item, linkedCancellationToken.Token); } catch (ObjectDisposedException ex) { @@ -82,6 +85,11 @@ private async Task BackgroundProcessingAsync(CancellationToken cancellationToken _logger.ServiceCancelled(ServiceName); } + private void ProcessThread(ScuWorkRequest request, CancellationToken cancellationToken) + { + Task.Run(() => Process(request, cancellationToken)); + } + private async Task Process(ScuWorkRequest request, CancellationToken cancellationToken) { ScuWorkResponse response = null; diff --git a/src/InformaticsGateway/Services/Scu/ScuWorkRequest.cs b/src/InformaticsGateway/Services/Scu/ScuWorkRequest.cs index 43fdb79fb..49e825471 100644 --- a/src/InformaticsGateway/Services/Scu/ScuWorkRequest.cs +++ b/src/InformaticsGateway/Services/Scu/ScuWorkRequest.cs @@ -33,8 +33,9 @@ public class ScuWorkRequest : IDisposable public string HostIp { get; } public int Port { get; } public string AeTitle { get; } + public CancellationToken CancellationToken { get; } - public ScuWorkRequest(string correlationId, RequestType requestType, string hostIp, int port, string aeTitle) + public ScuWorkRequest(string correlationId, RequestType requestType, string hostIp, int port, string aeTitle, CancellationToken cancellationToken) { Guard.Against.NullOrWhiteSpace(correlationId); Guard.Against.NullOrWhiteSpace(hostIp); @@ -45,6 +46,7 @@ public ScuWorkRequest(string correlationId, RequestType requestType, string host HostIp = hostIp; Port = port; AeTitle = aeTitle; + CancellationToken = cancellationToken; _awaiter = new AsyncManualResetEvent(false); } diff --git a/src/InformaticsGateway/Test/Services/Scu/ScuServiceTest.cs b/src/InformaticsGateway/Test/Services/Scu/ScuServiceTest.cs index c71b6524d..465ef6fdb 100644 --- a/src/InformaticsGateway/Test/Services/Scu/ScuServiceTest.cs +++ b/src/InformaticsGateway/Test/Services/Scu/ScuServiceTest.cs @@ -96,7 +96,7 @@ public async Task GivenAValidDicomEntity_WhenRequestToCEcho_ExpectToReturnSucess Assert.Equal(ServiceStatus.Running, svc.Status); - var request = new ScuWorkRequest(Guid.NewGuid().ToString(), RequestType.CEcho, "localhost", _port, DicomScpFixture.s_aETITLE); + var request = new ScuWorkRequest(Guid.NewGuid().ToString(), RequestType.CEcho, "localhost", _port, DicomScpFixture.s_aETITLE, CancellationToken.None); var response = await _scuQueue.Queue(request, _cancellationTokenSource.Token); @@ -113,7 +113,7 @@ public async Task GivenACEchoRequest_WhenRejected_ReturnStatusAssociationRejecte Assert.Equal(ServiceStatus.Running, svc.Status); - var request = new ScuWorkRequest(Guid.NewGuid().ToString(), RequestType.CEcho, "localhost", _port, "BADAET"); + var request = new ScuWorkRequest(Guid.NewGuid().ToString(), RequestType.CEcho, "localhost", _port, "BADAET", CancellationToken.None); var response = await _scuQueue.Queue(request, _cancellationTokenSource.Token); @@ -130,7 +130,7 @@ public async Task GivenACEchoRequest_WhenAborted_ReturnStatusAssociationAborted( Assert.Equal(ServiceStatus.Running, svc.Status); - var request = new ScuWorkRequest(Guid.NewGuid().ToString(), RequestType.CEcho, "localhost", _port, "ABORT"); + var request = new ScuWorkRequest(Guid.NewGuid().ToString(), RequestType.CEcho, "localhost", _port, "ABORT", CancellationToken.None); var response = await _scuQueue.Queue(request, _cancellationTokenSource.Token); @@ -147,7 +147,7 @@ public async Task GivenACEchoRequest_WhenRemoteServerIsUnreachable_ReturnStatusA Assert.Equal(ServiceStatus.Running, svc.Status); - var request = new ScuWorkRequest(Guid.NewGuid().ToString(), RequestType.CEcho, "UNKNOWNHOST123456789", _port, DicomScpFixture.s_aETITLE); + var request = new ScuWorkRequest(Guid.NewGuid().ToString(), RequestType.CEcho, "UNKNOWNHOST123456789", _port, DicomScpFixture.s_aETITLE, CancellationToken.None); var response = await _scuQueue.Queue(request, _cancellationTokenSource.Token);