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); } }
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; } } }