Skip to content

Commit d7aa279

Browse files
committed
* Refactor CachedString overload of BasicPublishAsync
1 parent 89affa2 commit d7aa279

File tree

2 files changed

+17
-39
lines changed

2 files changed

+17
-39
lines changed

projects/RabbitMQ.Client/Impl/Channel.PublisherConfirms.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,7 @@ private void HandleReturn(BasicReturnEventArgs basicReturnEvent)
239239
}
240240
}
241241

242+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
242243
private async Task MaybeHandlePublisherConfirmationTcsOnChannelShutdownAsync(ShutdownEventArgs reason)
243244
{
244245
if (_publisherConfirmationsEnabled)
@@ -265,6 +266,7 @@ await _confirmSemaphore.WaitAsync(reason.CancellationToken)
265266
}
266267
}
267268

269+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
268270
private async Task<PublisherConfirmationInfo?> MaybeStartPublisherConfirmationTracking(CancellationToken cancellationToken)
269271
{
270272
if (_publisherConfirmationsEnabled)
@@ -291,6 +293,7 @@ await _confirmSemaphore.WaitAsync(cancellationToken)
291293
}
292294
}
293295

296+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
294297
private bool MaybeHandleExceptionWithEnabledPublisherConfirmations(PublisherConfirmationInfo? publisherConfirmationInfo,
295298
Exception ex)
296299
{
@@ -312,6 +315,7 @@ private bool MaybeHandleExceptionWithEnabledPublisherConfirmations(PublisherConf
312315
return exceptionWasHandled;
313316
}
314317

318+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
315319
private async Task MaybeEndPublisherConfirmationTracking(PublisherConfirmationInfo? publisherConfirmationInfo,
316320
CancellationToken cancellationToken)
317321
{

projects/RabbitMQ.Client/Impl/Channel.cs

Lines changed: 13 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1004,26 +1004,13 @@ public async ValueTask BasicPublishAsync<TProperties>(CachedString exchange, Cac
10041004
CancellationToken cancellationToken = default)
10051005
where TProperties : IReadOnlyBasicProperties, IAmqpHeader
10061006
{
1007-
TaskCompletionSource<bool>? publisherConfirmationTcs = null;
1008-
ulong publishSequenceNumber = 0;
1007+
PublisherConfirmationInfo? publisherConfirmationInfo = null;
10091008
try
10101009
{
1011-
if (_publisherConfirmationsEnabled)
1012-
{
1013-
await _confirmSemaphore.WaitAsync(cancellationToken)
1010+
publisherConfirmationInfo =
1011+
await MaybeStartPublisherConfirmationTracking(cancellationToken)
10141012
.ConfigureAwait(false);
10151013

1016-
publishSequenceNumber = _nextPublishSeqNo;
1017-
1018-
if (_publisherConfirmationTrackingEnabled)
1019-
{
1020-
publisherConfirmationTcs = new(TaskCreationOptions.RunContinuationsAsynchronously);
1021-
_confirmsTaskCompletionSources[publishSequenceNumber] = publisherConfirmationTcs;
1022-
}
1023-
1024-
_nextPublishSeqNo++;
1025-
}
1026-
10271014
await EnforceFlowControlAsync(cancellationToken)
10281015
.ConfigureAwait(false);
10291016

@@ -1033,6 +1020,12 @@ await EnforceFlowControlAsync(cancellationToken)
10331020
? RabbitMQActivitySource.Send(routingKey.Value, exchange.Value, body.Length)
10341021
: default;
10351022

1023+
ulong publishSequenceNumber = 0;
1024+
if (publisherConfirmationInfo is not null)
1025+
{
1026+
publishSequenceNumber = publisherConfirmationInfo.PublishSequenceNumber;
1027+
}
1028+
10361029
BasicProperties? props = PopulateBasicPropertiesHeaders(basicProperties, sendActivity, publishSequenceNumber);
10371030
if (props is null)
10381031
{
@@ -1047,35 +1040,16 @@ await ModelSendAsync(in cmd, in props, body, cancellationToken)
10471040
}
10481041
catch (Exception ex)
10491042
{
1050-
if (_publisherConfirmationsEnabled)
1051-
{
1052-
_nextPublishSeqNo--;
1053-
if (_publisherConfirmationTrackingEnabled)
1054-
{
1055-
_confirmsTaskCompletionSources.TryRemove(publishSequenceNumber, out _);
1056-
}
1057-
}
1058-
1059-
if (publisherConfirmationTcs is not null)
1060-
{
1061-
publisherConfirmationTcs.SetException(ex);
1062-
}
1063-
else
1043+
bool exceptionWasHandled =
1044+
MaybeHandleExceptionWithEnabledPublisherConfirmations(publisherConfirmationInfo, ex);
1045+
if (!exceptionWasHandled)
10641046
{
10651047
throw;
10661048
}
10671049
}
10681050
finally
10691051
{
1070-
if (_publisherConfirmationsEnabled)
1071-
{
1072-
_confirmSemaphore.Release();
1073-
}
1074-
}
1075-
1076-
if (publisherConfirmationTcs is not null)
1077-
{
1078-
await publisherConfirmationTcs.Task.WaitAsync(cancellationToken)
1052+
await MaybeEndPublisherConfirmationTracking(publisherConfirmationInfo, cancellationToken)
10791053
.ConfigureAwait(false);
10801054
}
10811055
}

0 commit comments

Comments
 (0)