Skip to content

Commit 832194e

Browse files
committed
Add and build Shutdownable client/server programs for reproducing the fault
1 parent 0f6506f commit 832194e

File tree

3 files changed

+227
-0
lines changed

3 files changed

+227
-0
lines changed

default.build

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,8 @@
281281
<property name="example.program" value="DeclareQueue"/><call target="one-example"/>
282282
<property name="example.program" value="AddServer"/><call target="one-example"/>
283283
<property name="example.program" value="AddClient"/><call target="one-example"/>
284+
<property name="example.program" value="ShutdownableServer"/><call target="one-example"/>
285+
<property name="example.program" value="ShutdownableClient"/><call target="one-example"/>
284286
</target>
285287

286288
<target name="build-unit" description="compile unit tests"

src/examples/ShutdownableClient.cs

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
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.IO;
59+
using System.Text;
60+
61+
using RabbitMQ.Client;
62+
using RabbitMQ.Client.Content;
63+
using RabbitMQ.Client.MessagePatterns;
64+
65+
namespace RabbitMQ.Client.Examples {
66+
public class ShutdownableClient {
67+
public static int Main(string[] args) {
68+
try {
69+
if (args.Length < 1) {
70+
Console.Error.WriteLine("Usage: ShutdownableClient <hostname>[:<portnumber>] [<secondsdelay>]");
71+
Console.Error.WriteLine("RabbitMQ .NET client version "+typeof(IModel).Assembly.GetName().Version.ToString());
72+
return 1;
73+
}
74+
75+
using (IConnection conn = new ConnectionFactory().CreateConnection(args[0])) {
76+
using (IModel ch = conn.CreateModel()) {
77+
object[] callArgs = new object[1];
78+
if (args.Length > 1) {
79+
callArgs[0] = double.Parse(args[1]);
80+
} else {
81+
callArgs[0] = (double) 0.0;
82+
}
83+
84+
SimpleRpcClient client = new SimpleRpcClient(ch, "ShutdownableServer");
85+
client.TimeoutMilliseconds = 5000;
86+
client.TimedOut += new EventHandler(TimedOutHandler);
87+
client.Disconnected += new EventHandler(DisconnectedHandler);
88+
object[] reply = client.Call(callArgs);
89+
if (reply == null) {
90+
Console.WriteLine("Timeout or disconnection.");
91+
} else {
92+
Console.WriteLine("Reply: {0}", reply[0]);
93+
}
94+
}
95+
}
96+
return 0;
97+
} catch (Exception e) {
98+
Console.Error.WriteLine(e);
99+
return 2;
100+
}
101+
}
102+
103+
public static void TimedOutHandler(object sender, EventArgs e) {
104+
Console.WriteLine("Timed out.");
105+
}
106+
107+
public static void DisconnectedHandler(object sender, EventArgs e) {
108+
Console.WriteLine("Disconnected.");
109+
}
110+
}
111+
}

src/examples/ShutdownableServer.cs

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
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.Timers;
59+
60+
using RabbitMQ.Client;
61+
using RabbitMQ.Client.Content;
62+
using RabbitMQ.Client.MessagePatterns;
63+
using RabbitMQ.Util;
64+
65+
namespace RabbitMQ.Client.Examples {
66+
public class ShutdownableServer: SimpleRpcServer {
67+
public static int Main(string[] args) {
68+
try {
69+
if (args.Length < 1) {
70+
Console.Error.WriteLine("Usage: ShutdownableServer <hostname>[:<portnumber>]");
71+
Console.Error.WriteLine("RabbitMQ .NET client version "+typeof(IModel).Assembly.GetName().Version.ToString());
72+
return 1;
73+
}
74+
75+
using (IConnection conn = new ConnectionFactory().CreateConnection(args[0])) {
76+
using (IModel ch = conn.CreateModel()) {
77+
Subscription sub = new Subscription(ch, "ShutdownableServer");
78+
new ShutdownableServer(sub).MainLoop();
79+
}
80+
}
81+
return 0;
82+
} catch (Exception e) {
83+
Console.Error.WriteLine(e);
84+
return 2;
85+
}
86+
}
87+
88+
public ShutdownableServer(Subscription sub): base(sub) {}
89+
90+
public override void HandleStreamMessageCall(IStreamMessageBuilder replyWriter,
91+
bool isRedelivered,
92+
IBasicProperties requestProperties,
93+
object[] args)
94+
{
95+
Console.Out.WriteLine("ShutdownableServer received a {0} request.",
96+
isRedelivered ? "redelivered" : "new");
97+
if ((double) args[0] == 0) {
98+
Console.Out.WriteLine("Shutting down immediately.");
99+
Close();
100+
replyWriter.WriteObject("Shut down immediately");
101+
} else {
102+
Timer t = new Timer((int) (((double) args[0]) * 1000));
103+
t.Elapsed += new ElapsedEventHandler(OnTimeout);
104+
t.Enabled = true;
105+
replyWriter.WriteObject("Will shut down in " + args[0] + " seconds");
106+
}
107+
}
108+
109+
private void OnTimeout(object source, ElapsedEventArgs e) {
110+
Console.Out.WriteLine("Delayed shutdown happening now.");
111+
Close();
112+
}
113+
}
114+
}

0 commit comments

Comments
 (0)