Skip to content

Commit 1b12580

Browse files
author
Matthias Radestock
committed
merge bug21343 into default
2 parents 85713c3 + f43c0c0 commit 1b12580

File tree

5 files changed

+226
-2
lines changed

5 files changed

+226
-2
lines changed

RabbitMQDotNetClient.sln

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RabbitMQ.Client.Examples.Sh
5858
EndProject
5959
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RabbitMQ.Client.Examples.ShutdownableServer", "projects\examples\client\ShutdownableServer\RabbitMQ.Client.Examples.ShutdownableServer.csproj", "{8BCE15DB-C92F-4FA4-AE57-9CA73DE91EB2}"
6060
EndProject
61+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RabbitMQ.Client.Examples.PerfTest", "projects\examples\client\PerfTest\RabbitMQ.Client.Examples.PerfTest.csproj", "{6ED176D6-B789-4673-8300-CB671962FE00}"
62+
EndProject
6163
Global
6264
GlobalSection(SolutionConfigurationPlatforms) = preSolution
6365
Debug|Any CPU = Debug|Any CPU
@@ -184,6 +186,12 @@ Global
184186
{8BCE15DB-C92F-4FA4-AE57-9CA73DE91EB2}.DebugNoTest|Any CPU.Build.0 = Debug|Any CPU
185187
{8BCE15DB-C92F-4FA4-AE57-9CA73DE91EB2}.Release|Any CPU.ActiveCfg = Release|Any CPU
186188
{8BCE15DB-C92F-4FA4-AE57-9CA73DE91EB2}.Release|Any CPU.Build.0 = Release|Any CPU
189+
{6ED176D6-B789-4673-8300-CB671962FE00}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
190+
{6ED176D6-B789-4673-8300-CB671962FE00}.Debug|Any CPU.Build.0 = Debug|Any CPU
191+
{6ED176D6-B789-4673-8300-CB671962FE00}.DebugNoTest|Any CPU.ActiveCfg = Debug|Any CPU
192+
{6ED176D6-B789-4673-8300-CB671962FE00}.DebugNoTest|Any CPU.Build.0 = Debug|Any CPU
193+
{6ED176D6-B789-4673-8300-CB671962FE00}.Release|Any CPU.ActiveCfg = Release|Any CPU
194+
{6ED176D6-B789-4673-8300-CB671962FE00}.Release|Any CPU.Build.0 = Release|Any CPU
187195
EndGlobalSection
188196
GlobalSection(SolutionProperties) = preSolution
189197
HideSolutionNode = FALSE
@@ -210,6 +218,7 @@ Global
210218
{6BF8B993-1722-446E-89B3-7BAC6066BECC} = {78D13AD2-B1AC-442C-95C8-958D643FC40B}
211219
{44D14FF0-1015-4AAA-ABCA-BF611879816C} = {78D13AD2-B1AC-442C-95C8-958D643FC40B}
212220
{8BCE15DB-C92F-4FA4-AE57-9CA73DE91EB2} = {78D13AD2-B1AC-442C-95C8-958D643FC40B}
221+
{6ED176D6-B789-4673-8300-CB671962FE00} = {78D13AD2-B1AC-442C-95C8-958D643FC40B}
213222
{20E34D9F-EE72-4B55-B6FE-1D0DBE5B74CD} = {EA42A7EF-7CE6-4EDA-98EA-6675C7EF7F69}
214223
{39CA1299-1F9E-452E-AA00-4BF874944B1E} = {EA42A7EF-7CE6-4EDA-98EA-6675C7EF7F69}
215224
{201B37E1-9BFC-4A01-9760-30C5BB19CFE3} = {20E34D9F-EE72-4B55-B6FE-1D0DBE5B74CD}

projects/client/RabbitMQ.Client/src/client/impl/SocketFrameHandler_0_9.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,8 +85,8 @@ public SocketFrameHandler_0_9(AmqpTcpEndpoint endpoint)
8585
SslHelper.TcpUpgrade(m_socket.GetStream(), endpoint.Ssl) :
8686
m_socket.GetStream();
8787

88-
m_reader = new NetworkBinaryReader(netstream);
89-
m_writer = new NetworkBinaryWriter(netstream);
88+
m_reader = new NetworkBinaryReader(new BufferedStream(netstream));
89+
m_writer = new NetworkBinaryWriter(new BufferedStream(netstream));
9090
}
9191

9292
public AmqpTcpEndpoint Endpoint
@@ -118,6 +118,7 @@ public void SendHeader()
118118
m_writer.Write((byte)1);
119119
m_writer.Write((byte)m_endpoint.Protocol.MajorVersion);
120120
m_writer.Write((byte)m_endpoint.Protocol.MinorVersion);
121+
m_writer.Flush();
121122
}
122123
}
123124

@@ -134,6 +135,7 @@ public void WriteFrame(Frame frame)
134135
lock (m_writer)
135136
{
136137
frame.WriteTo(m_writer);
138+
m_writer.Flush();
137139
//Console.WriteLine("OUTBOUND:");
138140
//DebugUtil.DumpProperties(frame, Console.Out, 2);
139141
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
3+
<!-- Warning! This file contains important customizations. Using Visual Studio to edit project's properties might break things. -->
4+
<!-- Props file -->
5+
<Import Project="$(MSBuildProjectDirectory)\..\..\..\..\Local.props" />
6+
<!-- Visual Studio generated -->
7+
<PropertyGroup>
8+
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
9+
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
10+
<ProductVersion>9.0.21022</ProductVersion>
11+
<SchemaVersion>2.0</SchemaVersion>
12+
<ProjectGuid>{6ED176D6-B789-4673-8300-CB671962FE00}</ProjectGuid>
13+
<OutputType>Exe</OutputType>
14+
<AppDesignerFolder>properties</AppDesignerFolder>
15+
<RootNamespace>RabbitMQ.Client.Examples</RootNamespace>
16+
<AssemblyName>PerfTest</AssemblyName>
17+
<TargetFrameworkVersion>$(PropTargetFramework)</TargetFrameworkVersion>
18+
<FileAlignment>512</FileAlignment>
19+
</PropertyGroup>
20+
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
21+
<DebugSymbols>true</DebugSymbols>
22+
<DebugType>full</DebugType>
23+
<Optimize>false</Optimize>
24+
<OutputPath>build\bin\</OutputPath>
25+
<DefineConstants>DEBUG;TRACE</DefineConstants>
26+
<ErrorReport>prompt</ErrorReport>
27+
<WarningLevel>4</WarningLevel>
28+
</PropertyGroup>
29+
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
30+
<DebugType>pdbonly</DebugType>
31+
<Optimize>true</Optimize>
32+
<OutputPath>build\bin\</OutputPath>
33+
<DefineConstants>TRACE</DefineConstants>
34+
<ErrorReport>prompt</ErrorReport>
35+
<WarningLevel>4</WarningLevel>
36+
</PropertyGroup>
37+
<ItemGroup>
38+
<Reference Include="System" />
39+
<Reference Include="System.Data" />
40+
<Reference Include="System.Xml" />
41+
</ItemGroup>
42+
<ItemGroup>
43+
<Compile Include="properties\AssemblyInfo.cs" />
44+
</ItemGroup>
45+
<ItemGroup>
46+
<ProjectReference Include="..\..\..\client\RabbitMQ.Client\RabbitMQ.Client.csproj">
47+
<Project>{71713FDD-D5EC-40B2-A924-76F80AD57E12}</Project>
48+
<Name>RabbitMQ.Client</Name>
49+
</ProjectReference>
50+
</ItemGroup>
51+
<ItemGroup>
52+
<Compile Include="src\examples\PerfTest.cs" />
53+
</ItemGroup>
54+
<!-- Mono compatibility workarounds -->
55+
<PropertyGroup Condition=" '$(PropUsingMono)' == 'true'">
56+
<_DisabledWarnings>$(NoWarn)</_DisabledWarnings>
57+
</PropertyGroup>
58+
<!-- Microsoft CSharp targets -->
59+
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
60+
</Project>
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
using System.Reflection;
2+
using System.Runtime.CompilerServices;
3+
using System.Runtime.InteropServices;
4+
5+
// General Information about an assembly is controlled through the following
6+
// set of attributes. Change these attribute values to modify the information
7+
// associated with an assembly.
8+
[assembly: AssemblyTitle("PerfTest")]
9+
[assembly: AssemblyDescription("PerfTestExample")]
10+
[assembly: AssemblyConfiguration("")]
11+
[assembly: AssemblyCompany("LShift Ltd.")]
12+
[assembly: AssemblyProduct("RabbitMQ.Client")]
13+
[assembly: AssemblyCopyright("Copyright © 2007-2009 LShift Ltd., Cohesive Financial Technologies LLC., and Rabbit Technologies Ltd.")]
14+
[assembly: AssemblyTrademark("")]
15+
[assembly: AssemblyCulture("")]
16+
17+
// Setting ComVisible to false makes the types in this assembly not visible
18+
// to COM components. If you need to access a type in this assembly from
19+
// COM, set the ComVisible attribute to true on that type.
20+
[assembly: ComVisible(false)]
21+
22+
// The following GUID is for the ID of the typelib if this project is exposed to COM
23+
[assembly: Guid("F474896F-987C-4400-A4F9-1540DDB5F988")]
Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
// This source code is dual-licensed under the Apache License, version
2+
// 2.0, and the Mozilla Public License, version 1.1.
3+
//
4+
// The APL v2.0:
5+
//
6+
//---------------------------------------------------------------------------
7+
// Copyright (C) 2007-2009 LShift Ltd., Cohesive Financial
8+
// Technologies LLC., and Rabbit Technologies Ltd.
9+
//
10+
// Licensed under the Apache License, Version 2.0 (the "License");
11+
// you may not use this file except in compliance with the License.
12+
// You may obtain a copy of the License at
13+
//
14+
// http://www.apache.org/licenses/LICENSE-2.0
15+
//
16+
// Unless required by applicable law or agreed to in writing, software
17+
// distributed under the License is distributed on an "AS IS" BASIS,
18+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
19+
// See the License for the specific language governing permissions and
20+
// limitations under the License.
21+
//---------------------------------------------------------------------------
22+
//
23+
// The MPL v1.1:
24+
//
25+
//---------------------------------------------------------------------------
26+
// The contents of this file are subject to the Mozilla Public License
27+
// Version 1.1 (the "License"); you may not use this file except in
28+
// compliance with the License. You may obtain a copy of the License at
29+
// http://www.rabbitmq.com/mpl.html
30+
//
31+
// Software distributed under the License is distributed on an "AS IS"
32+
// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
33+
// License for the specific language governing rights and limitations
34+
// under the License.
35+
//
36+
// The Original Code is The RabbitMQ .NET Client.
37+
//
38+
// The Initial Developers of the Original Code are LShift Ltd,
39+
// Cohesive Financial Technologies LLC, and Rabbit Technologies Ltd.
40+
//
41+
// Portions created before 22-Nov-2008 00:00:00 GMT by LShift Ltd,
42+
// Cohesive Financial Technologies LLC, or Rabbit Technologies Ltd
43+
// are Copyright (C) 2007-2008 LShift Ltd, Cohesive Financial
44+
// Technologies LLC, and Rabbit Technologies Ltd.
45+
//
46+
// Portions created by LShift Ltd are Copyright (C) 2007-2009 LShift
47+
// Ltd. Portions created by Cohesive Financial Technologies LLC are
48+
// Copyright (C) 2007-2009 Cohesive Financial Technologies
49+
// LLC. Portions created by Rabbit Technologies Ltd are Copyright
50+
// (C) 2007-2009 Rabbit Technologies Ltd.
51+
//
52+
// All Rights Reserved.
53+
//
54+
// Contributor(s): ______________________________________.
55+
//
56+
//---------------------------------------------------------------------------
57+
using System;
58+
using System.Diagnostics;
59+
using System.Text;
60+
61+
using RabbitMQ.Client;
62+
using RabbitMQ.Client.MessagePatterns;
63+
64+
namespace RabbitMQ.Client.Examples {
65+
public class PerfTest {
66+
private static readonly byte[] Message = new byte[0];
67+
68+
public static int Main(string[] args) {
69+
try {
70+
if (args.Length < 2) {
71+
Console.Error.WriteLine("Usage: PerfTest <hostname>[:<portnumber>] <number of messages>");
72+
Console.Error.WriteLine("RabbitMQ .NET client version "+typeof(IModel).Assembly.GetName().Version.ToString());
73+
return 1;
74+
}
75+
76+
string serverAddress = args[0];
77+
int messageCount = int.Parse(args[1]);
78+
79+
using (IConnection conn =
80+
new ConnectionFactory().CreateConnection(serverAddress))
81+
{
82+
Stopwatch sendTimer = new Stopwatch();
83+
Stopwatch receiveTimer = new Stopwatch();
84+
85+
using (IModel ch = conn.CreateModel()) {
86+
sendTimer.Start();
87+
88+
for (int i = 0; i < messageCount; ++i) {
89+
ch.BasicPublish("", "", null, Message);
90+
}
91+
}
92+
sendTimer.Stop();
93+
94+
using (IModel ch = conn.CreateModel()) {
95+
string q = ch.QueueDeclare();
96+
97+
for (int i = 0; i < messageCount + 1; ++i) {
98+
ch.BasicPublish("", q, null, Message);
99+
}
100+
//This ensures that all messages have been enqueued
101+
ch.BasicGet(q, true);
102+
103+
QueueingBasicConsumer consumer =
104+
new QueueingBasicConsumer(ch);
105+
receiveTimer.Start();
106+
ch.BasicConsume(q, true, null, consumer);
107+
108+
for (int i = 0; i < messageCount; ++i) {
109+
consumer.Queue.Dequeue();
110+
}
111+
receiveTimer.Stop();
112+
}
113+
114+
Console.WriteLine("Performance Test Completed");
115+
Console.WriteLine("Send: {0}Hz", ToHertz(sendTimer.ElapsedMilliseconds, messageCount));
116+
Console.WriteLine("Receive: {0}Hz", ToHertz(receiveTimer.ElapsedMilliseconds, messageCount));
117+
118+
return 0;
119+
}
120+
} catch (Exception e) {
121+
Console.Error.WriteLine(e);
122+
return 2;
123+
}
124+
}
125+
126+
private static double ToHertz(long milliseconds, int messageCount) {
127+
return ((long)messageCount)*1000L/milliseconds;
128+
}
129+
}
130+
}

0 commit comments

Comments
 (0)