Example #1
0
 public ConsumerStream(
     ulong id,
     uint messagePrefetchCount,
     IDequeue <MessagePackage> dequeue,
     Connection connection,
     IFaultStrategy faultStrategy,
     IConsumerProxy proxy,
     BatchHandler batchHandler)
 {
     _id                = id;
     _dequeue           = dequeue;
     _connection        = connection;
     _faultStrategy     = faultStrategy;
     _proxy             = proxy;
     _batchHandler      = batchHandler;
     _cachedCommandFlow = new CommandFlow {
         ConsumerId = id, MessagePermits = messagePrefetchCount
     };
     _sendWhenZero = 0;
     _firstFlow    = true;
 }
Example #2
0
        public async Task <IConsumerStream> CreateStream(IConsumerProxy proxy, CancellationToken cancellationToken)
        {
            while (true)
            {
                try
                {
                    var connection = await _connectionPool.FindConnectionForTopic(_subscribe.Topic, cancellationToken);

                    var response = await connection.Send(_subscribe, proxy);

                    return(new ConsumerStream(response.ConsumerId, _messagePrefetchCount, proxy, connection, _faultStrategy, proxy, _batchHandler));
                }
                catch (OperationCanceledException)
                {
                    if (cancellationToken.IsCancellationRequested)
                    {
                        throw;
                    }
                    else
                    {
                        await Task.Delay(_faultStrategy.RetryInterval, cancellationToken);
                    }
                }
                catch (Exception exception)
                {
                    switch (_faultStrategy.DetermineFaultAction(exception))
                    {
                    case FaultAction.Relookup:
                    case FaultAction.Retry:
                        await Task.Delay(_faultStrategy.RetryInterval, cancellationToken);

                        continue;
                    }

                    throw;
                }
            }
        }
Example #3
0
        public async Task <SubscribeResponse> Send(CommandSubscribe command, IConsumerProxy proxy)
        {
            Task <BaseCommand>?responseTask = null;

            using (await _lock.Lock())
            {
                _consumerManager.Outgoing(command, proxy);
                var baseCommand = command.AsBaseCommand();
                responseTask = _requestResponseHandler.Outgoing(baseCommand);
                var sequence = Serializer.Serialize(baseCommand);
                await _stream.Send(sequence);
            }

            var response = await responseTask;

            if (response.CommandType == BaseCommand.Type.Error)
            {
                _consumerManager.Remove(command.ConsumerId);
                response.Error.Throw();
            }

            return(new SubscribeResponse(command.ConsumerId));
        }