diff --git a/projects/Benchmarks/ConsumerDispatching/AsyncBasicConsumerFake.cs b/projects/Benchmarks/ConsumerDispatching/AsyncBasicConsumerFake.cs index 80c5fb9ce0..3d1509f5a7 100644 --- a/projects/Benchmarks/ConsumerDispatching/AsyncBasicConsumerFake.cs +++ b/projects/Benchmarks/ConsumerDispatching/AsyncBasicConsumerFake.cs @@ -18,7 +18,7 @@ public AsyncBasicConsumerFake(ManualResetEventSlim autoResetEvent) _autoResetEvent = autoResetEvent; } - public Task HandleBasicDeliver(string consumerTag, ulong deliveryTag, bool redelivered, string exchange, string routingKey, + public Task HandleBasicDeliver(string consumerTag, ulong deliveryTag, bool redelivered, ReadOnlyMemory exchange, ReadOnlyMemory routingKey, in ReadOnlyBasicProperties properties, ReadOnlyMemory body) { if (Interlocked.Increment(ref _current) == Count) @@ -29,7 +29,7 @@ public Task HandleBasicDeliver(string consumerTag, ulong deliveryTag, bool redel return Task.CompletedTask; } - Task IBasicConsumer.HandleBasicDeliverAsync(string consumerTag, ulong deliveryTag, bool redelivered, string exchange, string routingKey, + Task IBasicConsumer.HandleBasicDeliverAsync(string consumerTag, ulong deliveryTag, bool redelivered, ReadOnlyMemory exchange, ReadOnlyMemory routingKey, ReadOnlyBasicProperties properties, ReadOnlyMemory body) { if (Interlocked.Increment(ref _current) == Count) diff --git a/projects/Benchmarks/ConsumerDispatching/ConsumerDispatcher.cs b/projects/Benchmarks/ConsumerDispatching/ConsumerDispatcher.cs index 15e5534adf..5d657be8d9 100644 --- a/projects/Benchmarks/ConsumerDispatching/ConsumerDispatcher.cs +++ b/projects/Benchmarks/ConsumerDispatching/ConsumerDispatcher.cs @@ -1,4 +1,5 @@ -using System; +using System; +using System.Text; using System.Threading; using System.Threading.Tasks; using BenchmarkDotNet.Attributes; @@ -16,10 +17,12 @@ public class ConsumerDispatcherBase private protected IConsumerDispatcher _dispatcher; private protected readonly AsyncBasicConsumerFake _consumer = new AsyncBasicConsumerFake(_autoResetEvent); protected readonly string _consumerTag = "ConsumerTag"; + protected static readonly byte[] _consumerTagBytes = Encoding.UTF8.GetBytes("ConsumerTag"); protected readonly ulong _deliveryTag = 500UL; - protected readonly string _exchange = "Exchange"; - protected readonly string _routingKey = "RoutingKey"; + protected static readonly byte[] _exchange = Encoding.UTF8.GetBytes("Exchange"); + protected static readonly byte[] _routingKey = Encoding.UTF8.GetBytes("RoutingKey"); protected readonly ReadOnlyBasicProperties _properties = new ReadOnlyBasicProperties(); + protected readonly byte[] _method = new byte[512]; protected readonly byte[] _body = new byte[512]; public ConsumerDispatcherBase() @@ -52,8 +55,8 @@ public async Task AsyncConsumerDispatcher() { for (int i = 0; i < Count; i++) { - await _dispatcher.HandleBasicDeliverAsync(_consumerTag, _deliveryTag, false, _exchange, _routingKey, _properties, body, - CancellationToken.None); + await _dispatcher.HandleBasicDeliverAsync(_consumerTagBytes, _deliveryTag, + false, _exchange, _routingKey, _properties, body, CancellationToken.None); } _autoResetEvent.Wait(); _autoResetEvent.Reset(); @@ -75,8 +78,8 @@ public async Task ConsumerDispatcher() { for (int i = 0; i < Count; i++) { - await _dispatcher.HandleBasicDeliverAsync(_consumerTag, _deliveryTag, false, _exchange, _routingKey, _properties, body, - CancellationToken.None); + await _dispatcher.HandleBasicDeliverAsync(_consumerTagBytes, _deliveryTag, + false, _exchange, _routingKey, _properties, body, CancellationToken.None); } _autoResetEvent.Wait(); _autoResetEvent.Reset(); diff --git a/projects/Benchmarks/WireFormatting/MethodSerialization.cs b/projects/Benchmarks/WireFormatting/MethodSerialization.cs index 1a67657c80..eb406e98d1 100644 --- a/projects/Benchmarks/WireFormatting/MethodSerialization.cs +++ b/projects/Benchmarks/WireFormatting/MethodSerialization.cs @@ -45,7 +45,7 @@ public override void SetUp() } [Benchmark] - public object BasicDeliverRead() => new BasicDeliver(_buffer.Span)._consumerTag; // return one property to not box when returning an object instead + public object BasicDeliverRead() => new BasicDeliver(_buffer)._consumerTag; // return one property to not box when returning an object instead [Benchmark] public int BasicPublishWrite() => _basicPublish.WriteTo(_buffer.Span); diff --git a/projects/RabbitMQ.Client/PublicAPI.Unshipped.txt b/projects/RabbitMQ.Client/PublicAPI.Unshipped.txt index ea016d86c8..b2b527f5bd 100644 --- a/projects/RabbitMQ.Client/PublicAPI.Unshipped.txt +++ b/projects/RabbitMQ.Client/PublicAPI.Unshipped.txt @@ -61,7 +61,6 @@ override RabbitMQ.Client.AmqpTimestamp.GetHashCode() -> int override RabbitMQ.Client.AmqpTimestamp.ToString() -> string override RabbitMQ.Client.Events.AsyncEventingBasicConsumer.HandleBasicCancelOk(string consumerTag) -> System.Threading.Tasks.Task override RabbitMQ.Client.Events.AsyncEventingBasicConsumer.HandleBasicConsumeOk(string consumerTag) -> System.Threading.Tasks.Task -override RabbitMQ.Client.Events.AsyncEventingBasicConsumer.HandleBasicDeliver(string consumerTag, ulong deliveryTag, bool redelivered, string exchange, string routingKey, in RabbitMQ.Client.ReadOnlyBasicProperties properties, System.ReadOnlyMemory body) -> System.Threading.Tasks.Task override RabbitMQ.Client.Events.AsyncEventingBasicConsumer.HandleChannelShutdown(object channel, RabbitMQ.Client.ShutdownEventArgs reason) -> System.Threading.Tasks.Task override RabbitMQ.Client.Events.EventingBasicConsumer.HandleBasicCancelOk(string consumerTag) -> void override RabbitMQ.Client.Events.EventingBasicConsumer.HandleBasicConsumeOk(string consumerTag) -> void @@ -291,7 +290,6 @@ RabbitMQ.Client.Events.BaseExceptionEventArgs.BaseExceptionEventArgs(System.Coll RabbitMQ.Client.Events.BasicAckEventArgs RabbitMQ.Client.Events.BasicAckEventArgs.BasicAckEventArgs(ulong deliveryTag, bool multiple) -> void RabbitMQ.Client.Events.BasicDeliverEventArgs -RabbitMQ.Client.Events.BasicDeliverEventArgs.BasicDeliverEventArgs(string consumerTag, ulong deliveryTag, bool redelivered, string exchange, string routingKey, in RabbitMQ.Client.ReadOnlyBasicProperties properties, System.ReadOnlyMemory body) -> void RabbitMQ.Client.Events.BasicNackEventArgs RabbitMQ.Client.Events.BasicNackEventArgs.BasicNackEventArgs(ulong deliveryTag, bool multiple, bool requeue) -> void RabbitMQ.Client.Events.BasicReturnEventArgs @@ -412,7 +410,6 @@ RabbitMQ.Client.IAsyncBasicConsumer.ConsumerCancelled -> RabbitMQ.Client.Events. RabbitMQ.Client.IAsyncBasicConsumer.HandleBasicCancel(string consumerTag) -> System.Threading.Tasks.Task RabbitMQ.Client.IAsyncBasicConsumer.HandleBasicCancelOk(string consumerTag) -> System.Threading.Tasks.Task RabbitMQ.Client.IAsyncBasicConsumer.HandleBasicConsumeOk(string consumerTag) -> System.Threading.Tasks.Task -RabbitMQ.Client.IAsyncBasicConsumer.HandleBasicDeliver(string consumerTag, ulong deliveryTag, bool redelivered, string exchange, string routingKey, in RabbitMQ.Client.ReadOnlyBasicProperties properties, System.ReadOnlyMemory body) -> System.Threading.Tasks.Task RabbitMQ.Client.IAsyncBasicConsumer.HandleChannelShutdown(object channel, RabbitMQ.Client.ShutdownEventArgs reason) -> System.Threading.Tasks.Task RabbitMQ.Client.IAuthMechanism RabbitMQ.Client.IAuthMechanism.handleChallenge(byte[] challenge, RabbitMQ.Client.ConnectionConfig config) -> byte[] @@ -802,9 +799,9 @@ readonly RabbitMQ.Client.Events.BasicDeliverEventArgs.BasicProperties -> RabbitM readonly RabbitMQ.Client.Events.BasicDeliverEventArgs.Body -> System.ReadOnlyMemory readonly RabbitMQ.Client.Events.BasicDeliverEventArgs.ConsumerTag -> string readonly RabbitMQ.Client.Events.BasicDeliverEventArgs.DeliveryTag -> ulong -readonly RabbitMQ.Client.Events.BasicDeliverEventArgs.Exchange -> string +readonly RabbitMQ.Client.Events.BasicDeliverEventArgs.Exchange -> System.ReadOnlyMemory readonly RabbitMQ.Client.Events.BasicDeliverEventArgs.Redelivered -> bool -readonly RabbitMQ.Client.Events.BasicDeliverEventArgs.RoutingKey -> string +readonly RabbitMQ.Client.Events.BasicDeliverEventArgs.RoutingKey -> System.ReadOnlyMemory readonly RabbitMQ.Client.Events.BasicNackEventArgs.DeliveryTag -> ulong readonly RabbitMQ.Client.Events.BasicNackEventArgs.Multiple -> bool readonly RabbitMQ.Client.Events.BasicNackEventArgs.Requeue -> bool @@ -863,7 +860,6 @@ static readonly RabbitMQ.Client.PublicationAddress.PSEUDO_URI_PARSER -> System.T virtual RabbitMQ.Client.AsyncDefaultBasicConsumer.HandleBasicCancel(string consumerTag) -> System.Threading.Tasks.Task virtual RabbitMQ.Client.AsyncDefaultBasicConsumer.HandleBasicCancelOk(string consumerTag) -> System.Threading.Tasks.Task virtual RabbitMQ.Client.AsyncDefaultBasicConsumer.HandleBasicConsumeOk(string consumerTag) -> System.Threading.Tasks.Task -virtual RabbitMQ.Client.AsyncDefaultBasicConsumer.HandleBasicDeliver(string consumerTag, ulong deliveryTag, bool redelivered, string exchange, string routingKey, in RabbitMQ.Client.ReadOnlyBasicProperties properties, System.ReadOnlyMemory body) -> System.Threading.Tasks.Task virtual RabbitMQ.Client.AsyncDefaultBasicConsumer.HandleChannelShutdown(object channel, RabbitMQ.Client.ShutdownEventArgs reason) -> System.Threading.Tasks.Task virtual RabbitMQ.Client.AsyncDefaultBasicConsumer.OnCancel(params string[] consumerTags) -> System.Threading.Tasks.Task virtual RabbitMQ.Client.DefaultBasicConsumer.HandleBasicCancel(string consumerTag) -> void @@ -882,7 +878,8 @@ virtual RabbitMQ.Client.TcpClientAdapter.ReceiveTimeout.get -> System.TimeSpan virtual RabbitMQ.Client.TcpClientAdapter.ReceiveTimeout.set -> void ~const RabbitMQ.Client.RabbitMQActivitySource.PublisherSourceName = "RabbitMQ.Client.Publisher" -> string ~const RabbitMQ.Client.RabbitMQActivitySource.SubscriberSourceName = "RabbitMQ.Client.Subscriber" -> string -~override RabbitMQ.Client.Events.EventingBasicConsumer.HandleBasicDeliverAsync(string consumerTag, ulong deliveryTag, bool redelivered, string exchange, string routingKey, RabbitMQ.Client.ReadOnlyBasicProperties properties, System.ReadOnlyMemory body) -> System.Threading.Tasks.Task +~override RabbitMQ.Client.Events.AsyncEventingBasicConsumer.HandleBasicDeliver(string consumerTag, ulong deliveryTag, bool redelivered, System.ReadOnlyMemory exchange, System.ReadOnlyMemory routingKey, in RabbitMQ.Client.ReadOnlyBasicProperties properties, System.ReadOnlyMemory body) -> System.Threading.Tasks.Task +~override RabbitMQ.Client.Events.EventingBasicConsumer.HandleBasicDeliverAsync(string consumerTag, ulong deliveryTag, bool redelivered, System.ReadOnlyMemory exchange, System.ReadOnlyMemory routingKey, RabbitMQ.Client.ReadOnlyBasicProperties properties, System.ReadOnlyMemory body) -> System.Threading.Tasks.Task ~RabbitMQ.Client.AmqpTcpEndpoint.AmqpTcpEndpoint(string hostName, int portOrMinusOne, RabbitMQ.Client.SslOption ssl, uint maxInboundMessageBodySize) -> void ~RabbitMQ.Client.ConnectionFactory.CreateConnectionAsync(RabbitMQ.Client.IEndpointResolver endpointResolver, string clientProvidedName, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task ~RabbitMQ.Client.ConnectionFactory.CreateConnectionAsync(string clientProvidedName, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task @@ -891,7 +888,9 @@ virtual RabbitMQ.Client.TcpClientAdapter.ReceiveTimeout.set -> void ~RabbitMQ.Client.ConnectionFactory.CreateConnectionAsync(System.Collections.Generic.IEnumerable hostnames, string clientProvidedName, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task ~RabbitMQ.Client.ConnectionFactory.CreateConnectionAsync(System.Collections.Generic.IEnumerable hostnames, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task ~RabbitMQ.Client.ConnectionFactory.CreateConnectionAsync(System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task -~RabbitMQ.Client.IBasicConsumer.HandleBasicDeliverAsync(string consumerTag, ulong deliveryTag, bool redelivered, string exchange, string routingKey, RabbitMQ.Client.ReadOnlyBasicProperties properties, System.ReadOnlyMemory body) -> System.Threading.Tasks.Task +~RabbitMQ.Client.Events.BasicDeliverEventArgs.BasicDeliverEventArgs(string consumerTag, ulong deliveryTag, bool redelivered, System.ReadOnlyMemory exchange, System.ReadOnlyMemory routingKey, in RabbitMQ.Client.ReadOnlyBasicProperties properties, System.ReadOnlyMemory body) -> void +~RabbitMQ.Client.IAsyncBasicConsumer.HandleBasicDeliver(string consumerTag, ulong deliveryTag, bool redelivered, System.ReadOnlyMemory exchange, System.ReadOnlyMemory routingKey, in RabbitMQ.Client.ReadOnlyBasicProperties properties, System.ReadOnlyMemory body) -> System.Threading.Tasks.Task +~RabbitMQ.Client.IBasicConsumer.HandleBasicDeliverAsync(string consumerTag, ulong deliveryTag, bool redelivered, System.ReadOnlyMemory exchange, System.ReadOnlyMemory routingKey, RabbitMQ.Client.ReadOnlyBasicProperties properties, System.ReadOnlyMemory body) -> System.Threading.Tasks.Task ~RabbitMQ.Client.IChannel.BasicCancelAsync(string consumerTag, bool noWait = false, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task ~RabbitMQ.Client.IChannel.BasicConsumeAsync(string queue, bool autoAck, string consumerTag, bool noLocal, bool exclusive, System.Collections.Generic.IDictionary arguments, RabbitMQ.Client.IBasicConsumer consumer, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task ~RabbitMQ.Client.IChannel.BasicGetAsync(string queue, bool autoAck, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.ValueTask @@ -956,4 +955,5 @@ virtual RabbitMQ.Client.TcpClientAdapter.ReceiveTimeout.set -> void ~static RabbitMQ.Client.IConnectionExtensions.CloseAsync(this RabbitMQ.Client.IConnection connection, System.TimeSpan timeout) -> System.Threading.Tasks.Task ~static RabbitMQ.Client.IConnectionExtensions.CloseAsync(this RabbitMQ.Client.IConnection connection, ushort reasonCode, string reasonText, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task ~static RabbitMQ.Client.IConnectionExtensions.CloseAsync(this RabbitMQ.Client.IConnection connection, ushort reasonCode, string reasonText, System.TimeSpan timeout) -> System.Threading.Tasks.Task -~virtual RabbitMQ.Client.DefaultBasicConsumer.HandleBasicDeliverAsync(string consumerTag, ulong deliveryTag, bool redelivered, string exchange, string routingKey, RabbitMQ.Client.ReadOnlyBasicProperties properties, System.ReadOnlyMemory body) -> System.Threading.Tasks.Task +~virtual RabbitMQ.Client.AsyncDefaultBasicConsumer.HandleBasicDeliver(string consumerTag, ulong deliveryTag, bool redelivered, System.ReadOnlyMemory exchange, System.ReadOnlyMemory routingKey, in RabbitMQ.Client.ReadOnlyBasicProperties properties, System.ReadOnlyMemory body) -> System.Threading.Tasks.Task +~virtual RabbitMQ.Client.DefaultBasicConsumer.HandleBasicDeliverAsync(string consumerTag, ulong deliveryTag, bool redelivered, System.ReadOnlyMemory exchange, System.ReadOnlyMemory routingKey, RabbitMQ.Client.ReadOnlyBasicProperties properties, System.ReadOnlyMemory body) -> System.Threading.Tasks.Task diff --git a/projects/RabbitMQ.Client/client/api/AsyncDefaultBasicConsumer.cs b/projects/RabbitMQ.Client/client/api/AsyncDefaultBasicConsumer.cs index 64fb982029..3d090df628 100644 --- a/projects/RabbitMQ.Client/client/api/AsyncDefaultBasicConsumer.cs +++ b/projects/RabbitMQ.Client/client/api/AsyncDefaultBasicConsumer.cs @@ -110,8 +110,8 @@ public virtual Task HandleBasicConsumeOk(string consumerTag) public virtual Task HandleBasicDeliver(string consumerTag, ulong deliveryTag, bool redelivered, - string exchange, - string routingKey, + ReadOnlyMemory exchange, + ReadOnlyMemory routingKey, in ReadOnlyBasicProperties properties, ReadOnlyMemory body) { @@ -166,7 +166,8 @@ void IBasicConsumer.HandleBasicConsumeOk(string consumerTag) throw new InvalidOperationException("Should never be called. Enable 'DispatchConsumersAsync'."); } - Task IBasicConsumer.HandleBasicDeliverAsync(string consumerTag, ulong deliveryTag, bool redelivered, string exchange, string routingKey, + Task IBasicConsumer.HandleBasicDeliverAsync(string consumerTag, ulong deliveryTag, bool redelivered, + ReadOnlyMemory exchange, ReadOnlyMemory routingKey, ReadOnlyBasicProperties properties, ReadOnlyMemory body) { throw new InvalidOperationException("Should never be called. Enable 'DispatchConsumersAsync'."); diff --git a/projects/RabbitMQ.Client/client/api/DefaultBasicConsumer.cs b/projects/RabbitMQ.Client/client/api/DefaultBasicConsumer.cs index 6d7e6c5b9a..a6dbc2b541 100644 --- a/projects/RabbitMQ.Client/client/api/DefaultBasicConsumer.cs +++ b/projects/RabbitMQ.Client/client/api/DefaultBasicConsumer.cs @@ -151,8 +151,8 @@ public virtual void HandleBasicConsumeOk(string consumerTag) public virtual Task HandleBasicDeliverAsync(string consumerTag, ulong deliveryTag, bool redelivered, - string exchange, - string routingKey, + ReadOnlyMemory exchange, + ReadOnlyMemory routingKey, ReadOnlyBasicProperties properties, ReadOnlyMemory body) { diff --git a/projects/RabbitMQ.Client/client/api/IAsyncBasicConsumer.cs b/projects/RabbitMQ.Client/client/api/IAsyncBasicConsumer.cs index 2a3c2d1ce1..698eef1342 100644 --- a/projects/RabbitMQ.Client/client/api/IAsyncBasicConsumer.cs +++ b/projects/RabbitMQ.Client/client/api/IAsyncBasicConsumer.cs @@ -49,8 +49,8 @@ public interface IAsyncBasicConsumer Task HandleBasicDeliver(string consumerTag, ulong deliveryTag, bool redelivered, - string exchange, - string routingKey, + ReadOnlyMemory exchange, + ReadOnlyMemory routingKey, in ReadOnlyBasicProperties properties, ReadOnlyMemory body); diff --git a/projects/RabbitMQ.Client/client/api/IBasicConsumer.cs b/projects/RabbitMQ.Client/client/api/IBasicConsumer.cs index 7c796911db..695a48dca0 100644 --- a/projects/RabbitMQ.Client/client/api/IBasicConsumer.cs +++ b/projects/RabbitMQ.Client/client/api/IBasicConsumer.cs @@ -92,8 +92,8 @@ public interface IBasicConsumer Task HandleBasicDeliverAsync(string consumerTag, ulong deliveryTag, bool redelivered, - string exchange, - string routingKey, + ReadOnlyMemory exchange, + ReadOnlyMemory routingKey, ReadOnlyBasicProperties properties, ReadOnlyMemory body); diff --git a/projects/RabbitMQ.Client/client/events/AsyncEventingBasicConsumer.cs b/projects/RabbitMQ.Client/client/events/AsyncEventingBasicConsumer.cs index 59520ef124..7e45d393be 100644 --- a/projects/RabbitMQ.Client/client/events/AsyncEventingBasicConsumer.cs +++ b/projects/RabbitMQ.Client/client/events/AsyncEventingBasicConsumer.cs @@ -76,7 +76,8 @@ await base.HandleBasicConsumeOk(consumerTag) } ///Fires the Received event. - public override Task HandleBasicDeliver(string consumerTag, ulong deliveryTag, bool redelivered, string exchange, string routingKey, + public override Task HandleBasicDeliver(string consumerTag, ulong deliveryTag, bool redelivered, + ReadOnlyMemory exchange, ReadOnlyMemory routingKey, in ReadOnlyBasicProperties properties, ReadOnlyMemory body) { var deliverEventArgs = new BasicDeliverEventArgs(consumerTag, deliveryTag, redelivered, exchange, routingKey, properties, body); diff --git a/projects/RabbitMQ.Client/client/events/BasicDeliverEventArgs.cs b/projects/RabbitMQ.Client/client/events/BasicDeliverEventArgs.cs index 9d0585cc24..5b00d8aa1b 100644 --- a/projects/RabbitMQ.Client/client/events/BasicDeliverEventArgs.cs +++ b/projects/RabbitMQ.Client/client/events/BasicDeliverEventArgs.cs @@ -42,8 +42,8 @@ public class BasicDeliverEventArgs : EventArgs public BasicDeliverEventArgs(string consumerTag, ulong deliveryTag, bool redelivered, - string exchange, - string routingKey, + ReadOnlyMemory exchange, + ReadOnlyMemory routingKey, in ReadOnlyBasicProperties properties, ReadOnlyMemory body) : base() { @@ -72,13 +72,13 @@ public BasicDeliverEventArgs(string consumerTag, ///The exchange the message was originally published ///to. - public readonly string Exchange; + public readonly ReadOnlyMemory Exchange; ///The AMQP "redelivered" flag. public readonly bool Redelivered; ///The routing key used when the message was ///originally published. - public readonly string RoutingKey; + public readonly ReadOnlyMemory RoutingKey; } } diff --git a/projects/RabbitMQ.Client/client/events/EventingBasicConsumer.cs b/projects/RabbitMQ.Client/client/events/EventingBasicConsumer.cs index ca57918fce..9b75d1a88f 100644 --- a/projects/RabbitMQ.Client/client/events/EventingBasicConsumer.cs +++ b/projects/RabbitMQ.Client/client/events/EventingBasicConsumer.cs @@ -86,7 +86,8 @@ public override void HandleBasicConsumeOk(string consumerTag) /// Accessing the body at a later point is unsafe as its memory can /// be already released. /// - public override async Task HandleBasicDeliverAsync(string consumerTag, ulong deliveryTag, bool redelivered, string exchange, string routingKey, + public override async Task HandleBasicDeliverAsync(string consumerTag, ulong deliveryTag, bool redelivered, + ReadOnlyMemory exchange, ReadOnlyMemory routingKey, ReadOnlyBasicProperties properties, ReadOnlyMemory body) { BasicDeliverEventArgs eventArgs = new BasicDeliverEventArgs(consumerTag, deliveryTag, redelivered, exchange, routingKey, properties, body); diff --git a/projects/RabbitMQ.Client/client/framing/BasicDeliver.cs b/projects/RabbitMQ.Client/client/framing/BasicDeliver.cs index ebc49cd4da..b0664d97fa 100644 --- a/projects/RabbitMQ.Client/client/framing/BasicDeliver.cs +++ b/projects/RabbitMQ.Client/client/framing/BasicDeliver.cs @@ -38,19 +38,19 @@ namespace RabbitMQ.Client.Framing.Impl { internal readonly struct BasicDeliver : IAmqpMethod { - public readonly string _consumerTag; + public readonly ReadOnlyMemory _consumerTag; public readonly ulong _deliveryTag; public readonly bool _redelivered; - public readonly string _exchange; - public readonly string _routingKey; + public readonly ReadOnlyMemory _exchange; + public readonly ReadOnlyMemory _routingKey; - public BasicDeliver(ReadOnlySpan span) + public BasicDeliver(ReadOnlyMemory data) { - int offset = WireFormatting.ReadShortstr(span, out _consumerTag); - offset += WireFormatting.ReadLonglong(span.Slice(offset), out _deliveryTag); - offset += WireFormatting.ReadBits(span.Slice(offset), out _redelivered); - offset += WireFormatting.ReadShortstr(span.Slice(offset), out _exchange); - WireFormatting.ReadShortstr(span.Slice(offset), out _routingKey); + int offset = WireFormatting.ReadShortMemory(data, out _consumerTag); + offset += WireFormatting.ReadLonglong(data.Span.Slice(offset), out _deliveryTag); + offset += WireFormatting.ReadBits(data.Span.Slice(offset), out _redelivered); + offset += WireFormatting.ReadShortMemory(data.Slice(offset), out _exchange); + WireFormatting.ReadShortMemory(data.Slice(offset), out _routingKey); } public ProtocolCommandId ProtocolCommandId => ProtocolCommandId.BasicDeliver; diff --git a/projects/RabbitMQ.Client/client/impl/ChannelBase.cs b/projects/RabbitMQ.Client/client/impl/ChannelBase.cs index fa4f4d2f50..505f0c4ce9 100644 --- a/projects/RabbitMQ.Client/client/impl/ChannelBase.cs +++ b/projects/RabbitMQ.Client/client/impl/ChannelBase.cs @@ -670,7 +670,7 @@ protected async Task HandleBasicDeliverAsync(IncomingCommand cmd, Cancella { try { - var method = new Client.Framing.Impl.BasicDeliver(cmd.MethodSpan); + var method = new Client.Framing.Impl.BasicDeliver(cmd.MethodMemory); var header = new ReadOnlyBasicProperties(cmd.HeaderSpan); await ConsumerDispatcher.HandleBasicDeliverAsync( method._consumerTag, diff --git a/projects/RabbitMQ.Client/client/impl/ConsumerDispatching/ConsumerDispatcherBase.cs b/projects/RabbitMQ.Client/client/impl/ConsumerDispatching/ConsumerDispatcherBase.cs index 41960fb5e1..4a7e3fb30a 100644 --- a/projects/RabbitMQ.Client/client/impl/ConsumerDispatching/ConsumerDispatcherBase.cs +++ b/projects/RabbitMQ.Client/client/impl/ConsumerDispatching/ConsumerDispatcherBase.cs @@ -1,8 +1,11 @@ -using System.Collections.Concurrent; +using System; +using System.Buffers; +using System.Collections.Concurrent; using System.Collections.Generic; -using System.Linq; using System.Runtime.CompilerServices; +using System.Text; using System.Threading.Tasks; +using RabbitMQ.Util; namespace RabbitMQ.Client.ConsumerDispatching { @@ -10,27 +13,70 @@ namespace RabbitMQ.Client.ConsumerDispatching internal abstract class ConsumerDispatcherBase { private static readonly FallbackConsumer s_fallbackConsumer = new FallbackConsumer(); - private readonly ConcurrentDictionary _consumers = new ConcurrentDictionary(); + private readonly ConcurrentDictionary, (IBasicConsumer, string)> _consumers; public IBasicConsumer? DefaultConsumer { get; set; } protected ConsumerDispatcherBase() { + var comparer = new ReadOnlyMemoryOfByteEqualityComparer(); + _consumers = new ConcurrentDictionary, (IBasicConsumer, string)>(comparer); } protected void AddConsumer(IBasicConsumer consumer, string tag) { - _consumers[tag] = consumer; + byte[] tagBytes = Encoding.UTF8.GetBytes(tag); + _consumers[tagBytes] = (consumer, tag); } - protected IBasicConsumer GetConsumerOrDefault(string tag) + protected (IBasicConsumer consumer, string consumerTag) GetConsumerOrDefault(ReadOnlyMemory tag) { - return _consumers.TryGetValue(tag, out IBasicConsumer? consumer) ? consumer : GetDefaultOrFallbackConsumer(); + if (_consumers.TryGetValue(tag, out (IBasicConsumer consumer, string consumerTag) consumerPair)) + { + return consumerPair; + } + +#if NET6_0_OR_GREATER + string consumerTag = Encoding.UTF8.GetString(tag.Span); +#else + string consumerTag; + unsafe + { + fixed (byte* bytes = tag.Span) + { + consumerTag = Encoding.UTF8.GetString(bytes, tag.Length); + } + } +#endif + + return (GetDefaultOrFallbackConsumer(), consumerTag); } public IBasicConsumer GetAndRemoveConsumer(string tag) { - return _consumers.Remove(tag, out IBasicConsumer? consumer) ? consumer : GetDefaultOrFallbackConsumer(); + ArrayPool pool = ArrayPool.Shared; + byte[]? buf = null; + try + { + buf = pool.Rent(Encoding.UTF8.GetMaxByteCount(tag.Length)); +#if NET6_0_OR_GREATER + int count = Encoding.UTF8.GetBytes(tag, buf); +#else + int count = Encoding.UTF8.GetBytes(tag, 0, tag.Length, buf, 0); +#endif + Memory memory = buf.AsMemory(0, count); + IBasicConsumer result = _consumers.Remove(memory, + out (IBasicConsumer consumer, string consumerTag) consumerPair) ? + consumerPair.consumer : GetDefaultOrFallbackConsumer(); + return result; + } + finally + { + if (buf != null) + { + pool.Return(buf); + } + } } public void Shutdown(ShutdownEventArgs reason) @@ -47,9 +93,9 @@ public Task ShutdownAsync(ShutdownEventArgs reason) private void DoShutdownConsumers(ShutdownEventArgs reason) { - foreach (KeyValuePair pair in _consumers.ToArray()) + foreach (KeyValuePair, (IBasicConsumer consumer, string consumerTag)> pair in _consumers.ToArray()) { - ShutdownConsumer(pair.Value, reason); + ShutdownConsumer(pair.Value.consumer, reason); } _consumers.Clear(); } diff --git a/projects/RabbitMQ.Client/client/impl/ConsumerDispatching/ConsumerDispatcherChannelBase.cs b/projects/RabbitMQ.Client/client/impl/ConsumerDispatching/ConsumerDispatcherChannelBase.cs index bef097f1a3..50d9a5bc9e 100644 --- a/projects/RabbitMQ.Client/client/impl/ConsumerDispatching/ConsumerDispatcherChannelBase.cs +++ b/projects/RabbitMQ.Client/client/impl/ConsumerDispatching/ConsumerDispatcherChannelBase.cs @@ -73,14 +73,14 @@ public ValueTask HandleBasicConsumeOkAsync(IBasicConsumer consumer, string consu } } - public ValueTask HandleBasicDeliverAsync(string consumerTag, ulong deliveryTag, bool redelivered, - string exchange, string routingKey, in ReadOnlyBasicProperties basicProperties, RentedMemory body, + public ValueTask HandleBasicDeliverAsync(ReadOnlyMemory consumerTag, ulong deliveryTag, bool redelivered, + ReadOnlyMemory exchange, ReadOnlyMemory routingKey, in ReadOnlyBasicProperties basicProperties, RentedMemory body, CancellationToken cancellationToken) { if (false == _disposed && false == _quiesce) { - IBasicConsumer consumer = GetConsumerOrDefault(consumerTag); - var work = WorkStruct.CreateDeliver(consumer, consumerTag, deliveryTag, redelivered, exchange, routingKey, basicProperties, body); + (IBasicConsumer consumer, string consumerTag) consumerPair = GetConsumerOrDefault(consumerTag); + var work = WorkStruct.CreateDeliver(consumerPair.consumer, consumerPair.consumerTag, deliveryTag, redelivered, exchange, routingKey, basicProperties, body); return _writer.WriteAsync(work, cancellationToken); } else @@ -257,8 +257,8 @@ protected override Task InternalShutdownAsync() public readonly string? ConsumerTag; public readonly ulong DeliveryTag; public readonly bool Redelivered; - public readonly string? Exchange; - public readonly string? RoutingKey; + public readonly ReadOnlyMemory Exchange; + public readonly ReadOnlyMemory RoutingKey; public readonly ReadOnlyBasicProperties BasicProperties; public readonly RentedMemory Body; public readonly ShutdownEventArgs? Reason; @@ -281,7 +281,7 @@ private WorkStruct(IBasicConsumer consumer, ShutdownEventArgs reason) } private WorkStruct(IBasicConsumer consumer, string consumerTag, ulong deliveryTag, bool redelivered, - string exchange, string routingKey, in ReadOnlyBasicProperties basicProperties, RentedMemory body) + ReadOnlyMemory exchange, ReadOnlyMemory routingKey, in ReadOnlyBasicProperties basicProperties, RentedMemory body) { WorkType = WorkType.Deliver; Consumer = consumer; @@ -316,7 +316,7 @@ public static WorkStruct CreateShutdown(IBasicConsumer consumer, ShutdownEventAr } public static WorkStruct CreateDeliver(IBasicConsumer consumer, string consumerTag, ulong deliveryTag, bool redelivered, - string exchange, string routingKey, in ReadOnlyBasicProperties basicProperties, RentedMemory body) + ReadOnlyMemory exchange, ReadOnlyMemory routingKey, in ReadOnlyBasicProperties basicProperties, RentedMemory body) { return new WorkStruct(consumer, consumerTag, deliveryTag, redelivered, exchange, routingKey, basicProperties, body); diff --git a/projects/RabbitMQ.Client/client/impl/ConsumerDispatching/FallbackConsumer.cs b/projects/RabbitMQ.Client/client/impl/ConsumerDispatching/FallbackConsumer.cs index dd9ae73852..2e63fe58f5 100644 --- a/projects/RabbitMQ.Client/client/impl/ConsumerDispatching/FallbackConsumer.cs +++ b/projects/RabbitMQ.Client/client/impl/ConsumerDispatching/FallbackConsumer.cs @@ -37,7 +37,8 @@ void IBasicConsumer.HandleBasicConsumeOk(string consumerTag) ESLog.Info($"Unhandled {nameof(IBasicConsumer.HandleBasicConsumeOk)} for tag {consumerTag}"); } - Task IBasicConsumer.HandleBasicDeliverAsync(string consumerTag, ulong deliveryTag, bool redelivered, string exchange, string routingKey, + Task IBasicConsumer.HandleBasicDeliverAsync(string consumerTag, ulong deliveryTag, bool redelivered, + ReadOnlyMemory exchange, ReadOnlyMemory routingKey, ReadOnlyBasicProperties properties, ReadOnlyMemory body) { ESLog.Info($"Unhandled {nameof(IBasicConsumer.HandleBasicDeliverAsync)} for tag {consumerTag}"); @@ -67,7 +68,7 @@ Task IAsyncBasicConsumer.HandleBasicConsumeOk(string consumerTag) return Task.CompletedTask; } - Task IAsyncBasicConsumer.HandleBasicDeliver(string consumerTag, ulong deliveryTag, bool redelivered, string exchange, string routingKey, + Task IAsyncBasicConsumer.HandleBasicDeliver(string consumerTag, ulong deliveryTag, bool redelivered, ReadOnlyMemory exchange, ReadOnlyMemory routingKey, in ReadOnlyBasicProperties properties, ReadOnlyMemory body) { return ((IBasicConsumer)this).HandleBasicDeliverAsync(consumerTag, deliveryTag, redelivered, exchange, routingKey, properties, body); diff --git a/projects/RabbitMQ.Client/client/impl/ConsumerDispatching/IConsumerDispatcher.cs b/projects/RabbitMQ.Client/client/impl/ConsumerDispatching/IConsumerDispatcher.cs index 3c1646af46..17c2cca133 100644 --- a/projects/RabbitMQ.Client/client/impl/ConsumerDispatching/IConsumerDispatcher.cs +++ b/projects/RabbitMQ.Client/client/impl/ConsumerDispatching/IConsumerDispatcher.cs @@ -46,11 +46,11 @@ internal interface IConsumerDispatcher : IDisposable ValueTask HandleBasicConsumeOkAsync(IBasicConsumer consumer, string consumerTag, CancellationToken cancellationToken); - ValueTask HandleBasicDeliverAsync(string consumerTag, + ValueTask HandleBasicDeliverAsync(ReadOnlyMemory consumerTag, ulong deliveryTag, bool redelivered, - string exchange, - string routingKey, + ReadOnlyMemory exchange, + ReadOnlyMemory routingKey, in ReadOnlyBasicProperties basicProperties, RentedMemory body, CancellationToken cancellationToken); diff --git a/projects/RabbitMQ.Client/client/impl/IncomingCommand.cs b/projects/RabbitMQ.Client/client/impl/IncomingCommand.cs index d5fb43d016..3e16aa1823 100644 --- a/projects/RabbitMQ.Client/client/impl/IncomingCommand.cs +++ b/projects/RabbitMQ.Client/client/impl/IncomingCommand.cs @@ -55,6 +55,14 @@ public IncomingCommand(ProtocolCommandId commandId, Body = body; } + public ReadOnlyMemory MethodMemory + { + get + { + return Method.Memory; + } + } + public ReadOnlySpan MethodSpan { get diff --git a/projects/RabbitMQ.Client/client/impl/RabbitMQActivitySource.cs b/projects/RabbitMQ.Client/client/impl/RabbitMQActivitySource.cs index f68d4e1596..99cd4c766f 100644 --- a/projects/RabbitMQ.Client/client/impl/RabbitMQActivitySource.cs +++ b/projects/RabbitMQ.Client/client/impl/RabbitMQActivitySource.cs @@ -1,8 +1,10 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Diagnostics; using System.Net; using System.Net.Sockets; using System.Reflection; +using System.Runtime.CompilerServices; using System.Text; using RabbitMQ.Client.Events; using RabbitMQ.Client.Impl; @@ -110,6 +112,28 @@ internal static Activity Receive(string routingKey, string exchange, ulong deliv return activity; } + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static string GetString(ReadOnlySpan span) + { +#if NETSTANDARD + if (span.Length == 0) + { + return string.Empty; + } + + unsafe + { + fixed (byte* bytesPtr = span) + { + return Encoding.UTF8.GetString(bytesPtr, span.Length); + } + } +#else + return Encoding.UTF8.GetString(span); +#endif + } + + internal static Activity Deliver(BasicDeliverEventArgs deliverEventArgs) { if (!s_subscriberSource.HasListeners()) @@ -120,14 +144,28 @@ internal static Activity Deliver(BasicDeliverEventArgs deliverEventArgs) // Extract the PropagationContext of the upstream parent from the message headers. DistributedContextPropagator.Current.ExtractTraceIdAndState(deliverEventArgs.BasicProperties.Headers, ExtractTraceIdAndState, out string traceparent, out string traceState); + ActivityContext.TryParse(traceparent, traceState, out ActivityContext parentContext); + + string routingKey = UseRoutingKeyAsOperationName ? GetString(deliverEventArgs.RoutingKey.Span) : null; Activity activity = s_subscriberSource.StartLinkedRabbitMQActivity( - UseRoutingKeyAsOperationName ? $"{deliverEventArgs.RoutingKey} deliver" : "deliver", + UseRoutingKeyAsOperationName ? $"{routingKey} deliver" : "deliver", ActivityKind.Consumer, parentContext); + if (activity != null && activity.IsAllDataRequested) { - PopulateMessagingTags("deliver", deliverEventArgs.RoutingKey, deliverEventArgs.Exchange, - deliverEventArgs.DeliveryTag, deliverEventArgs.BasicProperties, deliverEventArgs.Body.Length, + string exchange = GetString(deliverEventArgs.Exchange.Span); + if (routingKey == null) + { + routingKey = GetString(deliverEventArgs.RoutingKey.Span); + } + + PopulateMessagingTags("deliver", + routingKey, + exchange, + deliverEventArgs.DeliveryTag, + deliverEventArgs.BasicProperties, + deliverEventArgs.Body.Length, activity); } diff --git a/projects/RabbitMQ.Client/client/impl/WireFormatting.Read.cs b/projects/RabbitMQ.Client/client/impl/WireFormatting.Read.cs index 1149b97b97..5f2b3acd84 100644 --- a/projects/RabbitMQ.Client/client/impl/WireFormatting.Read.cs +++ b/projects/RabbitMQ.Client/client/impl/WireFormatting.Read.cs @@ -192,6 +192,27 @@ public static int ReadShortstr(ReadOnlySpan span, out string value) return ThrowArgumentOutOfRangeException(span.Length, byteCount + 1); } + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static int ReadShortMemory(ReadOnlyMemory data, out ReadOnlyMemory value) + { + int byteCount = data.Span[0]; + if (byteCount == 0) + { + value = default; + return 1; + } + + // equals data.Length >= byteCount + 1 + if (data.Length > byteCount) + { + value = data.Slice(1, byteCount); + return 1 + byteCount; + } + + value = default; + return ThrowArgumentOutOfRangeException(data.Length, byteCount + 1); + } + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int ReadBits(ReadOnlySpan span, out bool val) { diff --git a/projects/RabbitMQ.Client/util/ReadOnlyMemoryOfByteEqualityComparer.cs b/projects/RabbitMQ.Client/util/ReadOnlyMemoryOfByteEqualityComparer.cs new file mode 100644 index 0000000000..8c9dd2a8bc --- /dev/null +++ b/projects/RabbitMQ.Client/util/ReadOnlyMemoryOfByteEqualityComparer.cs @@ -0,0 +1,71 @@ +// This source code is dual-licensed under the Apache License, version +// 2.0, and the Mozilla Public License, version 2.0. +// +// The APL v2.0: +// +//--------------------------------------------------------------------------- +// Copyright (c) 2007-2020 VMware, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +//--------------------------------------------------------------------------- +// +// The MPL v2.0: +// +//--------------------------------------------------------------------------- +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at https://mozilla.org/MPL/2.0/. +// +// Copyright (c) 2007-2020 VMware, Inc. All rights reserved. +//--------------------------------------------------------------------------- + +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; + +namespace RabbitMQ.Util +{ + internal sealed class ReadOnlyMemoryOfByteEqualityComparer : IEqualityComparer> + { + public bool Equals(ReadOnlyMemory left, ReadOnlyMemory right) + { + return left.Span.SequenceEqual(right.Span); + } + + public int GetHashCode(ReadOnlyMemory value) + { +#if NETSTANDARD + unchecked + { + int hashCode = 0; + var longPart = MemoryMarshal.Cast(value.Span); + foreach (long item in longPart) + { + hashCode = (hashCode * 397) ^ item.GetHashCode(); + } + + foreach (int item in value.Span.Slice(longPart.Length * 8)) + { + hashCode = (hashCode * 397) ^ item.GetHashCode(); + } + + return hashCode; + } +#else + HashCode result = default; + result.AddBytes(value.Span); + return result.ToHashCode(); +#endif + } + } +} diff --git a/projects/Test/Common/TestConnectionRecoveryBase.cs b/projects/Test/Common/TestConnectionRecoveryBase.cs index e8eb2884e7..a381c1c346 100644 --- a/projects/Test/Common/TestConnectionRecoveryBase.cs +++ b/projects/Test/Common/TestConnectionRecoveryBase.cs @@ -318,8 +318,8 @@ public TestBasicConsumer(IChannel channel, ushort totalMessageCount, TaskComplet public override Task HandleBasicDeliverAsync(string consumerTag, ulong deliveryTag, bool redelivered, - string exchange, - string routingKey, + ReadOnlyMemory exchange, + ReadOnlyMemory routingKey, ReadOnlyBasicProperties properties, ReadOnlyMemory body) { diff --git a/projects/Test/Integration/TestAsyncConsumer.cs b/projects/Test/Integration/TestAsyncConsumer.cs index f41a9acf3f..d2e95b96c3 100644 --- a/projects/Test/Integration/TestAsyncConsumer.cs +++ b/projects/Test/Integration/TestAsyncConsumer.cs @@ -730,7 +730,7 @@ public override Task HandleBasicConsumeOk(string consumerTag) } public override Task HandleBasicDeliver(string consumerTag, ulong deliveryTag, bool redelivered, - string exchange, string routingKey, in ReadOnlyBasicProperties properties, ReadOnlyMemory body) + ReadOnlyMemory exchange, ReadOnlyMemory routingKey, in ReadOnlyBasicProperties properties, ReadOnlyMemory body) { _output.WriteLine("[ERROR] {0} HandleBasicDeliver {1}", _logPrefix, consumerTag); return base.HandleBasicDeliver(consumerTag, deliveryTag, redelivered, exchange, routingKey, properties, body); diff --git a/projects/Test/Integration/TestAsyncConsumerExceptions.cs b/projects/Test/Integration/TestAsyncConsumerExceptions.cs index 9262474d09..1475a8b41e 100644 --- a/projects/Test/Integration/TestAsyncConsumerExceptions.cs +++ b/projects/Test/Integration/TestAsyncConsumerExceptions.cs @@ -132,8 +132,8 @@ public ConsumerFailingOnDelivery(IChannel channel) : base(channel) public override Task HandleBasicDeliver(string consumerTag, ulong deliveryTag, bool redelivered, - string exchange, - string routingKey, + ReadOnlyMemory exchange, + ReadOnlyMemory routingKey, in ReadOnlyBasicProperties properties, ReadOnlyMemory body) { diff --git a/projects/Test/Integration/TestConsumerExceptions.cs b/projects/Test/Integration/TestConsumerExceptions.cs index d5961871e5..cac19af963 100644 --- a/projects/Test/Integration/TestConsumerExceptions.cs +++ b/projects/Test/Integration/TestConsumerExceptions.cs @@ -56,8 +56,8 @@ public ConsumerFailingOnDelivery(IChannel channel) : base(channel) public override Task HandleBasicDeliverAsync(string consumerTag, ulong deliveryTag, bool redelivered, - string exchange, - string routingKey, + ReadOnlyMemory exchange, + ReadOnlyMemory routingKey, ReadOnlyBasicProperties properties, ReadOnlyMemory body) { diff --git a/projects/Test/Integration/TestConsumerOperationDispatch.cs b/projects/Test/Integration/TestConsumerOperationDispatch.cs index 264a300440..e3a3e0b0eb 100644 --- a/projects/Test/Integration/TestConsumerOperationDispatch.cs +++ b/projects/Test/Integration/TestConsumerOperationDispatch.cs @@ -85,7 +85,7 @@ public CollectingConsumer(IChannel channel) } public override Task HandleBasicDeliverAsync(string consumerTag, - ulong deliveryTag, bool redelivered, string exchange, string routingKey, + ulong deliveryTag, bool redelivered, ReadOnlyMemory exchange, ReadOnlyMemory routingKey, ReadOnlyBasicProperties properties, ReadOnlyMemory body) { // we test concurrent dispatch from the moment basic.delivery is returned. diff --git a/projects/Test/Integration/TestMainLoop.cs b/projects/Test/Integration/TestMainLoop.cs index 22efb8c7df..1253f08161 100644 --- a/projects/Test/Integration/TestMainLoop.cs +++ b/projects/Test/Integration/TestMainLoop.cs @@ -59,8 +59,8 @@ public FaultyConsumer(IChannel channel) : base(channel) { } public override Task HandleBasicDeliverAsync(string consumerTag, ulong deliveryTag, bool redelivered, - string exchange, - string routingKey, + ReadOnlyMemory exchange, + ReadOnlyMemory routingKey, ReadOnlyBasicProperties properties, ReadOnlyMemory body) {