Beispiel #1
0
 public async ValueTask <bool> HasChannels()
 {
     using (await _lock.Lock())
     {
         return(_channelManager.HasChannels());
     }
 }
        private async ValueTask <Connection> GetConnection(Uri serviceUrl, CancellationToken cancellationToken)
        {
            using (await _lock.Lock(cancellationToken).ConfigureAwait(false))
            {
                if (_connections.TryGetValue(serviceUrl, out Connection connection))
                {
                    return(connection);
                }

                return(await EstablishNewConnection(serviceUrl, cancellationToken).ConfigureAwait(false));
            }
        }
        public async ValueTask <bool> HasChannels(CancellationToken cancellationToken)
        {
            ThrowIfDisposed();

            using (await _lock.Lock(cancellationToken).ConfigureAwait(false))
            {
                return(_channelManager.HasChannels());
            }
        }
Beispiel #4
0
        public async Task Execute(Action action, CancellationToken cancellationToken)
        {
            using (await _lock.Lock(cancellationToken))
            {
                while (true)
                {
                    try
                    {
                        action();
                        return;
                    }
                    catch (Exception exception)
                    {
                        await _onException(exception, cancellationToken);
                    }

                    cancellationToken.ThrowIfCancellationRequested();
                }
            }
        }
Beispiel #5
0
        private async Task <Connection> CreateConnection(Uri serviceUrl, CancellationToken cancellationToken)
        {
            using (await _lock.Lock(cancellationToken))
            {
                if (_connections.TryGetValue(serviceUrl, out Connection connection))
                {
                    return(connection);
                }

                var stream = await _connector.Connect(serviceUrl);

                connection = new Connection(stream);
                Register(serviceUrl, connection);

                var response = await connection.Send(_commandConnect);

                response.Expect(BaseCommand.Type.Connected);

                return(connection);
            }
        }
Beispiel #6
0
 public async ValueTask Execute(Action action, CancellationToken cancellationToken)
 {
     using (await _lock.Lock(cancellationToken).ConfigureAwait(false))
     {
         await _executor.Execute(action, cancellationToken).ConfigureAwait(false);
     }
 }
Beispiel #7
0
 public async Task <bool> IsActive()
 {
     using (await _lock.Lock())
     {
         return(_producerManager.HasProducers || _consumerManager.HasConsumers);
     }
 }
Beispiel #8
0
        public async ValueTask <Message> Receive(CancellationToken cancellationToken)
        {
            using (await _lock.Lock(cancellationToken).ConfigureAwait(false))
            {
                while (true)
                {
                    if (_sendWhenZero == 0)
                    {
                        await SendFlow(cancellationToken).ConfigureAwait(false);
                    }

                    _sendWhenZero--;

                    var message = _batchHandler.GetNext();

                    if (message is not null)
                    {
                        return(message);
                    }

                    var messagePackage = await _queue.Dequeue(cancellationToken).ConfigureAwait(false);

                    if (!messagePackage.IsValid())
                    {
                        await RejectPackage(messagePackage, cancellationToken).ConfigureAwait(false);

                        continue;
                    }

                    var metadataSize    = messagePackage.GetMetadataSize();
                    var redeliveryCount = messagePackage.RedeliveryCount;
                    var data            = messagePackage.ExtractData(metadataSize);
                    var metadata        = messagePackage.ExtractMetadata(metadataSize);
                    var messageId       = messagePackage.MessageId;

                    return(metadata.ShouldSerializeNumMessagesInBatch()
                        ? _batchHandler.Add(messageId, redeliveryCount, metadata, data)
                        : MessageFactory.Create(new MessageId(messageId), redeliveryCount, metadata, data));
                }
            }
        }
Beispiel #9
0
        public async ValueTask <Message> Receive(CancellationToken cancellationToken)
        {
            using (await _lock.Lock(cancellationToken).ConfigureAwait(false))
            {
                while (true)
                {
                    if (_sendWhenZero == 0)
                    {
                        await SendFlow(cancellationToken).ConfigureAwait(false);
                    }

                    _sendWhenZero--;

                    var message = _batchHandler.GetNext();

                    if (message is not null)
                    {
                        return(message);
                    }

                    var messagePackage = await _queue.Dequeue(cancellationToken).ConfigureAwait(false);

                    if (!messagePackage.ValidateMagicNumberAndChecksum())
                    {
                        await RejectPackage(messagePackage, CommandAck.ValidationErrorType.ChecksumMismatch, cancellationToken).ConfigureAwait(false);

                        continue;
                    }

                    var metadataSize = messagePackage.GetMetadataSize();
                    var metadata     = messagePackage.ExtractMetadata(metadataSize);
                    var data         = messagePackage.ExtractData(metadataSize);

                    if (metadata.Compression != CompressionType.None)
                    {
                        var decompressor = _decompressors[(int)metadata.Compression];
                        if (decompressor is null)
                        {
                            throw new CompressionException($"Support for {metadata.Compression} compression was not found");
                        }

                        try
                        {
                            data = decompressor.Decompress(data, (int)metadata.UncompressedSize);
                        }
                        catch
                        {
                            await RejectPackage(messagePackage, CommandAck.ValidationErrorType.DecompressionError, cancellationToken).ConfigureAwait(false);

                            continue;
                        }
                    }

                    var messageId       = messagePackage.MessageId;
                    var redeliveryCount = messagePackage.RedeliveryCount;

                    return(metadata.ShouldSerializeNumMessagesInBatch()
                        ? _batchHandler.Add(messageId, redeliveryCount, metadata, data)
                        : MessageFactory.Create(messageId.ToMessageId(), redeliveryCount, metadata, data));
                }
            }
        }