Skip to content

Commit eb48e2d

Browse files
Merge pull request #788 from Anarh2404/basicpublish-readonlymemory-overload
Add ReadOnlyMemory overload to BasicPublish
2 parents 68545fb + ed3e56a commit eb48e2d

File tree

8 files changed

+96
-15
lines changed

8 files changed

+96
-15
lines changed

projects/Apigen/apigen/Apigen.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1108,10 +1108,14 @@ public void MaybeEmitModelMethod(MethodInfo method)
11081108

11091109
public string SanitisedFullName(Type t)
11101110
{
1111-
if (t.FullName.StartsWith("System.Collections.Generic.IDictionary`2[[System.String"))
1111+
if (t.Equals(typeof(IDictionary<string, object>)))
11121112
{
11131113
return "IDictionary<string, object>";
11141114
}
1115+
if (t.Equals(typeof(ReadOnlyMemory<byte>)))
1116+
{
1117+
return "ReadOnlyMemory<byte>";
1118+
}
11151119

11161120
switch (t.FullName)
11171121
{

projects/RabbitMQ.Client/client/api/IModel.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,7 @@ string BasicConsume(
231231
/// </remarks>
232232
[AmqpMethodDoNotImplement(null)]
233233
void BasicPublish(string exchange, string routingKey, bool mandatory,
234-
IBasicProperties basicProperties, byte[] body);
234+
IBasicProperties basicProperties, ReadOnlyMemory<byte> body);
235235

236236
/// <summary>
237237
/// Configures QoS parameters of the Basic content-class.

projects/RabbitMQ.Client/client/api/IModelExtensions.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
// Copyright (c) 2007-2020 VMware, Inc. All rights reserved.
3939
//---------------------------------------------------------------------------
4040

41+
using System;
4142
using System.Collections.Generic;
4243

4344
namespace RabbitMQ.Client
@@ -88,7 +89,7 @@ public static string BasicConsume(this IModel model, string queue,
8889
/// <remarks>
8990
/// The publication occurs with mandatory=false and immediate=false.
9091
/// </remarks>
91-
public static void BasicPublish(this IModel model, PublicationAddress addr, IBasicProperties basicProperties, byte[] body)
92+
public static void BasicPublish(this IModel model, PublicationAddress addr, IBasicProperties basicProperties, ReadOnlyMemory<byte> body)
9293
{
9394
model.BasicPublish(addr.ExchangeName, addr.RoutingKey, basicProperties: basicProperties, body: body);
9495
}
@@ -99,15 +100,15 @@ public static void BasicPublish(this IModel model, PublicationAddress addr, IBas
99100
/// <remarks>
100101
/// The publication occurs with mandatory=false
101102
/// </remarks>
102-
public static void BasicPublish(this IModel model, string exchange, string routingKey, IBasicProperties basicProperties, byte[] body)
103+
public static void BasicPublish(this IModel model, string exchange, string routingKey, IBasicProperties basicProperties, ReadOnlyMemory<byte> body)
103104
{
104105
model.BasicPublish(exchange, routingKey, false, basicProperties, body);
105106
}
106107

107108
/// <summary>
108109
/// (Spec method) Convenience overload of BasicPublish.
109110
/// </summary>
110-
public static void BasicPublish(this IModel model, string exchange, string routingKey, bool mandatory = false, IBasicProperties basicProperties = null, byte[] body = null)
111+
public static void BasicPublish(this IModel model, string exchange, string routingKey, bool mandatory = false, IBasicProperties basicProperties = null, ReadOnlyMemory<byte> body = default)
111112
{
112113
model.BasicPublish(exchange, routingKey, mandatory, basicProperties, body);
113114
}

projects/RabbitMQ.Client/client/impl/AutorecoveringModel.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -556,7 +556,7 @@ public void _Private_BasicPublish(string exchange,
556556
string routingKey,
557557
bool mandatory,
558558
IBasicProperties basicProperties,
559-
byte[] body)
559+
ReadOnlyMemory<byte> body)
560560
{
561561
if (routingKey == null)
562562
{
@@ -806,7 +806,7 @@ public void BasicPublish(string exchange,
806806
string routingKey,
807807
bool mandatory,
808808
IBasicProperties basicProperties,
809-
byte[] body)
809+
ReadOnlyMemory<byte> body)
810810
{
811811
if (routingKey == null)
812812
{

projects/RabbitMQ.Client/client/impl/IFullModel.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@ void _Private_BasicPublish(string exchange,
227227
string routingKey,
228228
bool mandatory,
229229
[AmqpContentHeaderMapping] IBasicProperties basicProperties,
230-
[AmqpContentBodyMapping] byte[] body);
230+
[AmqpContentBodyMapping] ReadOnlyMemory<byte> body);
231231

232232
[AmqpForceOneWay]
233233
[AmqpMethodMapping(null, "basic", "recover")]

projects/RabbitMQ.Client/client/impl/ModelBase.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -349,7 +349,7 @@ public MethodBase ModelRpc(MethodBase method, ContentHeaderBase header, byte[] b
349349
}
350350
}
351351

352-
public void ModelSend(MethodBase method, ContentHeaderBase header, byte[] body)
352+
public void ModelSend(MethodBase method, ContentHeaderBase header, ReadOnlyMemory<byte> body)
353353
{
354354
if (method.HasContent)
355355
{
@@ -905,7 +905,7 @@ public abstract void _Private_BasicPublish(string exchange,
905905
string routingKey,
906906
bool mandatory,
907907
IBasicProperties basicProperties,
908-
byte[] body);
908+
ReadOnlyMemory<byte> body);
909909

910910
public abstract void _Private_BasicRecover(bool requeue);
911911

@@ -1100,7 +1100,7 @@ public void BasicPublish(string exchange,
11001100
string routingKey,
11011101
bool mandatory,
11021102
IBasicProperties basicProperties,
1103-
byte[] body)
1103+
ReadOnlyMemory<byte> body)
11041104
{
11051105
if (routingKey == null)
11061106
{

projects/Unit/APIApproval.Approve.approved.txt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -353,7 +353,7 @@ namespace RabbitMQ.Client
353353
string BasicConsume(string queue, bool autoAck, string consumerTag, bool noLocal, bool exclusive, System.Collections.Generic.IDictionary<string, object> arguments, RabbitMQ.Client.IBasicConsumer consumer);
354354
RabbitMQ.Client.BasicGetResult BasicGet(string queue, bool autoAck);
355355
void BasicNack(ulong deliveryTag, bool multiple, bool requeue);
356-
void BasicPublish(string exchange, string routingKey, bool mandatory, RabbitMQ.Client.IBasicProperties basicProperties, byte[] body);
356+
void BasicPublish(string exchange, string routingKey, bool mandatory, RabbitMQ.Client.IBasicProperties basicProperties, System.ReadOnlyMemory<byte> body);
357357
void BasicQos(uint prefetchSize, ushort prefetchCount, bool global);
358358
void BasicRecover(bool requeue);
359359
void BasicRecoverAsync(bool requeue);
@@ -398,9 +398,9 @@ namespace RabbitMQ.Client
398398
public static string BasicConsume(this RabbitMQ.Client.IModel model, string queue, bool autoAck, string consumerTag, RabbitMQ.Client.IBasicConsumer consumer) { }
399399
public static string BasicConsume(this RabbitMQ.Client.IModel model, string queue, bool autoAck, string consumerTag, System.Collections.Generic.IDictionary<string, object> arguments, RabbitMQ.Client.IBasicConsumer consumer) { }
400400
public static string BasicConsume(this RabbitMQ.Client.IModel model, RabbitMQ.Client.IBasicConsumer consumer, string queue, bool autoAck = false, string consumerTag = "", bool noLocal = false, bool exclusive = false, System.Collections.Generic.IDictionary<string, object> arguments = null) { }
401-
public static void BasicPublish(this RabbitMQ.Client.IModel model, RabbitMQ.Client.PublicationAddress addr, RabbitMQ.Client.IBasicProperties basicProperties, byte[] body) { }
402-
public static void BasicPublish(this RabbitMQ.Client.IModel model, string exchange, string routingKey, RabbitMQ.Client.IBasicProperties basicProperties, byte[] body) { }
403-
public static void BasicPublish(this RabbitMQ.Client.IModel model, string exchange, string routingKey, bool mandatory = false, RabbitMQ.Client.IBasicProperties basicProperties = null, byte[] body = null) { }
401+
public static void BasicPublish(this RabbitMQ.Client.IModel model, RabbitMQ.Client.PublicationAddress addr, RabbitMQ.Client.IBasicProperties basicProperties, System.ReadOnlyMemory<byte> body) { }
402+
public static void BasicPublish(this RabbitMQ.Client.IModel model, string exchange, string routingKey, RabbitMQ.Client.IBasicProperties basicProperties, System.ReadOnlyMemory<byte> body) { }
403+
public static void BasicPublish(this RabbitMQ.Client.IModel model, string exchange, string routingKey, bool mandatory = false, RabbitMQ.Client.IBasicProperties basicProperties = null, System.ReadOnlyMemory<byte> body = default) { }
404404
public static void ExchangeBind(this RabbitMQ.Client.IModel model, string destination, string source, string routingKey, System.Collections.Generic.IDictionary<string, object> arguments = null) { }
405405
public static void ExchangeBindNoWait(this RabbitMQ.Client.IModel model, string destination, string source, string routingKey, System.Collections.Generic.IDictionary<string, object> arguments = null) { }
406406
public static void ExchangeDeclare(this RabbitMQ.Client.IModel model, string exchange, string type, bool durable = false, bool autoDelete = false, System.Collections.Generic.IDictionary<string, object> arguments = null) { }

projects/Unit/TestBasicPublish.cs

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
using System;
2+
using System.Threading;
3+
using System.Threading.Tasks;
4+
using NUnit.Framework;
5+
using RabbitMQ.Client.Events;
6+
7+
namespace RabbitMQ.Client.Unit
8+
{
9+
[TestFixture]
10+
public class TestBasicPublish
11+
{
12+
[Test]
13+
public void TestBasicRoundtripArray()
14+
{
15+
var cf = new ConnectionFactory();
16+
using(IConnection c = cf.CreateConnection())
17+
using(IModel m = c.CreateModel())
18+
{
19+
QueueDeclareOk q = m.QueueDeclare();
20+
IBasicProperties bp = m.CreateBasicProperties();
21+
byte[] sendBody = System.Text.Encoding.UTF8.GetBytes("hi");
22+
byte[] consumeBody = null;
23+
var consumer = new EventingBasicConsumer(m);
24+
var are = new AutoResetEvent(false);
25+
consumer.Received += async (o, a) =>
26+
{
27+
consumeBody = a.Body.ToArray();
28+
are.Set();
29+
await Task.Yield();
30+
};
31+
string tag = m.BasicConsume(q.QueueName, true, consumer);
32+
33+
34+
m.BasicPublish("", q.QueueName, bp, sendBody);
35+
bool waitResFalse = are.WaitOne(2000);
36+
m.BasicCancel(tag);
37+
38+
39+
Assert.IsTrue(waitResFalse);
40+
Assert.AreEqual(sendBody, consumeBody);
41+
}
42+
}
43+
44+
[Test]
45+
public void TestBasicRoundtripReadOnlyMemory()
46+
{
47+
var cf = new ConnectionFactory();
48+
using(IConnection c = cf.CreateConnection())
49+
using(IModel m = c.CreateModel())
50+
{
51+
QueueDeclareOk q = m.QueueDeclare();
52+
IBasicProperties bp = m.CreateBasicProperties();
53+
byte[] sendBody = System.Text.Encoding.UTF8.GetBytes("hi");
54+
byte[] consumeBody = null;
55+
var consumer = new EventingBasicConsumer(m);
56+
var are = new AutoResetEvent(false);
57+
consumer.Received += async (o, a) =>
58+
{
59+
consumeBody = a.Body.ToArray();
60+
are.Set();
61+
await Task.Yield();
62+
};
63+
string tag = m.BasicConsume(q.QueueName, true, consumer);
64+
65+
66+
m.BasicPublish("", q.QueueName, bp, new ReadOnlyMemory<byte>(sendBody));
67+
bool waitResFalse = are.WaitOne(2000);
68+
m.BasicCancel(tag);
69+
70+
71+
Assert.IsTrue(waitResFalse);
72+
Assert.AreEqual(sendBody, consumeBody);
73+
}
74+
}
75+
}
76+
}

0 commit comments

Comments
 (0)