|
37 | 37 | using System.Threading.Tasks;
|
38 | 38 | using RabbitMQ.Client;
|
39 | 39 |
|
40 |
| -const int MESSAGE_COUNT = 50_000; |
| 40 | +// const int MESSAGE_COUNT = 50_000; |
| 41 | +const int MESSAGE_COUNT = 5; |
41 | 42 | bool debug = false;
|
42 | 43 |
|
43 | 44 | #pragma warning disable CS8321 // Local function is declared but never used
|
44 | 45 |
|
45 |
| -await PublishMessagesIndividuallyAsync(); |
46 |
| -await PublishMessagesInBatchAsync(); |
| 46 | +// await PublishMessagesIndividuallyAsync(); |
| 47 | +// await PublishMessagesInBatchAsync(); |
47 | 48 | await HandlePublishConfirmsAsynchronously();
|
48 | 49 |
|
49 | 50 | static Task<IConnection> CreateConnectionAsync()
|
@@ -190,6 +191,24 @@ async Task CleanOutstandingConfirms(ulong deliveryTag, bool multiple)
|
190 | 191 | }
|
191 | 192 | }
|
192 | 193 |
|
| 194 | + channel.BasicReturnAsync += (sender, ea) => |
| 195 | + { |
| 196 | + long sequenceNumber = 0; |
| 197 | + |
| 198 | + IReadOnlyBasicProperties props = ea.BasicProperties; |
| 199 | + if (props.Headers is not null) |
| 200 | + { |
| 201 | + object? maybeSeqNum = props.Headers["x-sequence-number"]; |
| 202 | + if (maybeSeqNum is not null) |
| 203 | + { |
| 204 | + sequenceNumber = (long)maybeSeqNum; |
| 205 | + } |
| 206 | + } |
| 207 | + |
| 208 | + Console.WriteLine($"{DateTime.Now} [WARNING] message sequence number {sequenceNumber} has been basic.return-ed"); |
| 209 | + return CleanOutstandingConfirms((ulong)sequenceNumber, false); |
| 210 | + }; |
| 211 | + |
193 | 212 | channel.BasicAcksAsync += (sender, ea) => CleanOutstandingConfirms(ea.DeliveryTag, ea.Multiple);
|
194 | 213 | channel.BasicNacksAsync += (sender, ea) =>
|
195 | 214 | {
|
@@ -220,7 +239,19 @@ async Task CleanOutstandingConfirms(ulong deliveryTag, bool multiple)
|
220 | 239 | semaphore.Release();
|
221 | 240 | }
|
222 | 241 |
|
223 |
| - ValueTask pt = channel.BasicPublishAsync(exchange: string.Empty, routingKey: queueName, body: body); |
| 242 | + var props = new BasicProperties |
| 243 | + { |
| 244 | + Headers = new Dictionary<string, object?>() |
| 245 | + { |
| 246 | + ["x-sequence-number"] = (long)nextPublishSeqNo |
| 247 | + } |
| 248 | + }; |
| 249 | + |
| 250 | + // string rk = queueName; |
| 251 | + string rk = Guid.NewGuid().ToString(); |
| 252 | + ValueTask pt = channel.BasicPublishAsync(exchange: string.Empty, routingKey: rk, body: body, |
| 253 | + mandatory: true, basicProperties: props); |
| 254 | + |
224 | 255 | publishTasks.Add(pt.AsTask());
|
225 | 256 | }
|
226 | 257 |
|
|
0 commit comments