Ejemplo n.º 1
0
        private async ValueTask SendSerializedPayloadToNextAvailableClient(SerializedPayload serializedPayload)
        {
            // keep trying to find an available client
            while (true)
            {
                var client = _dispatcher.NextAvailable();

                // if no subscription is found then just wait
                if (client is null)
                {
                    await _throttling.WaitAndIncrease();

                    continue;
                }

                // reset the _throttling to base value
                _throttling.Reset();

                // get ticket for payload
                try
                {
                    _logger.LogInformation(
                        $"Adding message with id: {serializedPayload.PayloadId} to subscription with id: {client.Id} in topic: {Name}");
                    var ticket = client.Enqueue(serializedPayload);
                    ticket.OnStatusChanged += OnStatusChanged;
                    break;
                }
                catch (ChannelClosedException)
                {
                    // no-op since the client might be disposed
                }
            }
        }
        public async Task <SendAsyncResult> SendAsync(SerializedPayload serializedPayload,
                                                      bool completeOnSeverOkReceived, CancellationToken cancellationToken)
        {
            if (completeOnSeverOkReceived)
            {
                var sendPayloadTask =
                    _taskManager.Setup(serializedPayload.PayloadId, true, cancellationToken);

                var sendSuccess = await _connectionManager.SendAsync(serializedPayload, cancellationToken);

                if (sendSuccess)
                {
                    _taskManager.OnPayloadSendSuccess(serializedPayload.PayloadId);
                }
                else
                {
                    _taskManager.OnPayloadSendFailed(serializedPayload.PayloadId);
                }

                return(await sendPayloadTask);
            }
            else
            {
                var sendSuccess = await _connectionManager.SendAsync(serializedPayload, cancellationToken);

                return(new SendAsyncResult {
                    IsSuccess = sendSuccess
                });
            }
        }
        /// <inheritdoc />
        public async Task <bool> SendAsync(SerializedPayload serializedPayload, CancellationToken cancellationToken)
        {
            while (!cancellationToken.IsCancellationRequested)
            {
                // wait for connection to be reestablished
                if (!(Socket?.Connected ?? false))
                {
                    _logger.LogTrace("Waiting for broker to reconnect");
                    try
                    {
                        await Task.Delay(1000, cancellationToken);

                        continue;
                    }
                    catch (TaskCanceledException)
                    {
                        return(false);
                    }
                }

                try
                {
                    await _semaphore.WaitAsync(cancellationToken);

                    var result = await Client.SendAsync(serializedPayload.Data, cancellationToken);

                    _logger.LogTrace($"Sending payload with id {serializedPayload.PayloadId}");

                    if (result)
                    {
                        return(true);
                    }

                    if (!_configuration.AutoReconnect)
                    {
                        return(false);
                    }
                }
                catch (ObjectDisposedException)
                {
                    return(false);
                }
                catch (OperationCanceledException)
                {
                    return(false);
                }
                finally
                {
                    _semaphore.Release();
                }
            }

            // only when cancellation is requested
            return(false);
        }
Ejemplo n.º 4
0
        public override int GetHashCode()
        {
            int hash = 1;

            if (SerializedPayload.Length != 0)
            {
                hash ^= SerializedPayload.GetHashCode();
            }
            hash ^= signatures_.GetHashCode();
            if (_unknownFields != null)
            {
                hash ^= _unknownFields.GetHashCode();
            }
            return(hash);
        }
Ejemplo n.º 5
0
        /// <inheritdoc />
        public AsyncPayloadTicket Enqueue(SerializedPayload serializedPayload)
        {
            lock (this)
            {
                var queueWasSuccessful = _queue.Writer.TryWrite(serializedPayload);

                if (queueWasSuccessful)
                {
                    _logger.LogTrace($"Enqueue message: {serializedPayload.PayloadId} in client: {Id}");

                    var ticket = ObjectPool.Shared.Rent <AsyncPayloadTicket>();

                    ticket.Setup(serializedPayload.PayloadId);

                    _tickets[ticket.PayloadId] = ticket;

                    return(ticket);
                }

                throw new ChannelClosedException();
            }
        }
Ejemplo n.º 6
0
 /// <inheritdoc />
 public void EnqueueFireAndForget(SerializedPayload serializedPayload)
 {
     _queue.Writer.TryWrite(serializedPayload);
 }