Exemple #1
0
 public void SetSendResult(RomeAppServiceResponseStatus status)
 {
     SendFinished?.Invoke(new PackageManagerSendQueueItemEventArgs
     {
         ResponseStatus = status,
     });
 }
        private async Task <RomeAppServiceResponse> SendViaMessageCarrier(Dictionary <string, object> data)
        {
            int tryCount = 0;

            var item = new PackageManagerSendQueueItem
            {
                RemoteSystemId = nrs.Id,
                Data           = data,
            };

            await sendQueueSemaphore.WaitAsync();

            sendQueue.Add(item);
            sendQueueSemaphore.Release();

            TaskCompletionSource <RomeAppServiceResponseStatus> tcs = new TaskCompletionSource <RomeAppServiceResponseStatus>();

            item.SendFinished += (e) =>
            {
                tcs.SetResult(e.ResponseStatus);
            };

            RomeAppServiceResponseStatus result = RomeAppServiceResponseStatus.RemoteSystemUnavailable;

            Debug.WriteLine("Waiting for Message Carrier to arrive...");
            while (tryCount < _maxRetryCount)
            {
                result = await tcs.Task.WithTimeout(TimeSpan.FromSeconds(_maxSecondsForCarrier), RomeAppServiceResponseStatus.Unknown);

                //Timeout
                if (result == RomeAppServiceResponseStatus.Unknown)
                {
                    if (tryCount < _maxRetryCount)
                    {
                        Debug.WriteLine("Message Carrier timeout, will retry...");
                        var connectResult = await Connect();

                        if (connectResult != RomeAppServiceConnectionStatus.Success)
                        {
                            Debug.WriteLine("Can't connect.");
                            result = RomeAppServiceResponseStatus.RemoteSystemUnavailable;
                        }
                        else
                        {
                            tryCount++;
                            continue;
                        }
                    }
                    else
                    {
                        result = RomeAppServiceResponseStatus.RemoteSystemUnavailable;
                        Debug.WriteLine("Message Carrier didn't arrive :(");
                    }
                }
                else
                {
                    Debug.WriteLine("Message Carrier arrived.");
                }

                break;
            }

            sendQueue.Remove(item);
            return(new RomeAppServiceResponse
            {
                Message = new Dictionary <string, object>(),
                Status = result,
            });
        }