Beispiel #1
0
        public async ValueTask <MessageId> Send(ReadOnlySequence <byte> data, CancellationToken cancellationToken)
        {
            ThrowIfDisposed();

            var metadata = _messageMetadataPool.Get();

            try
            {
                metadata.SequenceId = _sequenceId.FetchNext();
                return(await _executor.Execute(() => Send(metadata, data, cancellationToken), cancellationToken).ConfigureAwait(false));
            }
            finally
            {
                _messageMetadataPool.Return(metadata);
            }
        }
Beispiel #2
0
        public async ValueTask <MessageId> Send(MessageMetadata metadata, TMessage message, CancellationToken cancellationToken)
        {
            ThrowIfDisposed();

            var autoAssignSequenceId = metadata.SequenceId == 0;

            if (autoAssignSequenceId)
            {
                metadata.SequenceId = _sequenceId.FetchNext();
            }

            var activity = DotPulsarActivitySource.StartProducerActivity(metadata, _operationName, _tags);

            try
            {
                var partition = await ChoosePartitions(metadata, cancellationToken).ConfigureAwait(false);

                var producer  = _producers[partition];
                var data      = _options.Schema.Encode(message);
                var messageId = await producer.Send(metadata.Metadata, data, cancellationToken).ConfigureAwait(false);

                if (activity is not null && activity.IsAllDataRequested)
                {
                    activity.SetMessageId(messageId);
                    activity.SetPayloadSize(data.Length);
                    activity.SetStatusCode("OK");
                }

                return(messageId);
            }
            catch (Exception exception)
            {
                if (activity is not null && activity.IsAllDataRequested)
                {
                    activity.AddException(exception);
                }

                throw;
            }
            finally
            {
                activity?.Dispose();

                if (autoAssignSequenceId)
                {
                    metadata.SequenceId = 0;
                }
            }
        }