Example #1
0
        public async Task <IProducerStream> CreateStream(IProducerProxy proxy, CancellationToken cancellationToken)
        {
            var commandProducer = new CommandProducer
            {
                ProducerName = _options.ProducerName,
                Topic        = _options.Topic
            };

            while (true)
            {
                try
                {
                    var connection = await _connectionPool.FindConnectionForTopic(_options.Topic, cancellationToken);

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

                    return(new ProducerStream(response.ProducerId, response.ProducerName, _sequenceId, connection, _faultStrategy, proxy));
                }
                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 #2
0
        public ProducerStream(ulong id, string name, SequenceId sequenceId, Connection connection, IFaultStrategy faultStrategy, IProducerProxy proxy)
        {
            _cachedMetadata = new PulsarApi.MessageMetadata
            {
                ProducerName = name
            };

            var commandSend = new CommandSend
            {
                ProducerId  = id,
                NumMessages = 1
            };

            _cachedSendPackage = new SendPackage(commandSend, _cachedMetadata);

            _id            = id;
            _sequenceId    = sequenceId;
            _connection    = connection;
            _faultStrategy = faultStrategy;
            _proxy         = proxy;
        }
Example #3
0
        public async Task <ProducerResponse> Send(CommandProducer command, IProducerProxy proxy)
        {
            Task <BaseCommand>?responseTask = null;

            using (await _lock.Lock())
            {
                _producerManager.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)
            {
                _producerManager.Remove(command.ProducerId);
                response.Error.Throw();
            }

            return(new ProducerResponse(command.ProducerId, response.ProducerSuccess.ProducerName));
        }