Skip to content

Commit a24af6e

Browse files
committed
Example program using DefaultBasicConsumer directly.
1 parent 1ec6f80 commit a24af6e

File tree

2 files changed

+185
-0
lines changed

2 files changed

+185
-0
lines changed

default.build

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -271,6 +271,7 @@
271271
<property name="example.program" value="SendString"/><call target="one-example"/>
272272
<property name="example.program" value="SendMap"/><call target="one-example"/>
273273
<property name="example.program" value="LogTail"/><call target="one-example"/>
274+
<property name="example.program" value="LowlevelLogTail"/><call target="one-example"/>
274275
<property name="example.program" value="SingleGet"/><call target="one-example"/>
275276
<property name="example.program" value="ExceptionTest"/><call target="one-example"/>
276277
<property name="example.program" value="DeclareQueue"/><call target="one-example"/>
@@ -401,6 +402,7 @@
401402
<include name="${bin.dir}/SendString.exe"/>
402403
<include name="${bin.dir}/SendMap.exe"/>
403404
<include name="${bin.dir}/LogTail.exe"/>
405+
<include name="${bin.dir}/LowlevelLogTail.exe"/>
404406
<include name="${bin.dir}/SingleGet.exe"/>
405407
<include name="${bin.dir}/ExceptionTest.exe"/>
406408
<include name="${bin.dir}/DeclareQueue.exe"/>

src/examples/LowlevelLogTail.cs

Lines changed: 183 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,183 @@
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, 2008 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 by LShift Ltd., Cohesive Financial Technologies
42+
// LLC., and Rabbit Technologies Ltd. are Copyright (C) 2007, 2008
43+
// LShift Ltd., Cohesive Financial Technologies LLC., and Rabbit
44+
// Technologies Ltd.;
45+
//
46+
// All Rights Reserved.
47+
//
48+
// Contributor(s): ______________________________________.
49+
//
50+
//---------------------------------------------------------------------------
51+
using System;
52+
using System.IO;
53+
using System.Text;
54+
using System.Threading;
55+
56+
using RabbitMQ.Client;
57+
using RabbitMQ.Client.Content;
58+
using RabbitMQ.Client.Events;
59+
using RabbitMQ.Util;
60+
61+
namespace RabbitMQ.Client.Examples {
62+
public class LowlevelLogTail {
63+
public static int Main(string[] args) {
64+
try {
65+
if (args.Length < 4) {
66+
Console.Error.WriteLine("Usage: LowlevelLogTail <hostname>[:<portnumber>] <exchange> <exchangetype> <routingkey>");
67+
Console.Error.WriteLine("RabbitMQ .NET client version "+typeof(IModel).Assembly.GetName().Version.ToString());
68+
Console.Error.WriteLine("If the exchange name is the empty string, will instead declare a queue named");
69+
Console.Error.WriteLine("by the routingkey, and consume from that queue.");
70+
return 1;
71+
}
72+
73+
string serverAddress = args[0];
74+
string exchange = args[1];
75+
string exchangeType = args[2];
76+
string routingKey = args[3];
77+
78+
using (IConnection conn = new ConnectionFactory().CreateConnection(serverAddress))
79+
{
80+
using (IModel ch = conn.CreateModel())
81+
{
82+
ushort ticket = ch.AccessRequest("/data");
83+
84+
string queueName;
85+
if (exchange == "") {
86+
ch.QueueDeclare(ticket, routingKey);
87+
queueName = routingKey;
88+
} else {
89+
ch.ExchangeDeclare(ticket, exchange, exchangeType);
90+
queueName = ch.QueueDeclare(ticket);
91+
ch.QueueBind(ticket, queueName, exchange, routingKey, false, null);
92+
}
93+
94+
MyConsumer consumer = new MyConsumer(ch);
95+
ch.BasicConsume(ticket, queueName, null, consumer);
96+
97+
Console.WriteLine("Consumer tag: " + consumer.ConsumerTag);
98+
99+
while (consumer.IsRunning) {
100+
// Dummy main thread. Often, this will be
101+
// a GUI thread or similar.
102+
Thread.Sleep(500);
103+
}
104+
105+
return 0;
106+
}
107+
}
108+
} catch (Exception e) {
109+
Console.Error.WriteLine(e);
110+
return 2;
111+
}
112+
}
113+
114+
///<summary>Subclass of the very low-level DefaultBasicConsumer</summary>
115+
///<remarks>
116+
/// Be warned: the threading issues involved in using
117+
/// DefaultBasicConsumer can be subtle! Usually,
118+
/// QueueingBasicConsumer is what you want. Please see the
119+
/// comments attached to DefaultBasicConsumer, as well as the
120+
/// section on DefaultBasicConsumer and threading in the user
121+
/// manual.
122+
///</remarks>
123+
public class MyConsumer : DefaultBasicConsumer
124+
{
125+
public MyConsumer(IModel ch) : base(ch) {}
126+
127+
public override void HandleBasicDeliver(string consumerTag,
128+
ulong deliveryTag,
129+
bool redelivered,
130+
string exchange,
131+
string routingKey,
132+
IBasicProperties properties,
133+
byte[] body)
134+
{
135+
this.Model.BasicAck(deliveryTag, false);
136+
137+
// We only use BasicDeliverEventArgs here for
138+
// convenience. Often we wouldn't bother packaging up
139+
// all the arguments we received: we'd simply use
140+
// those we needed directly.
141+
BasicDeliverEventArgs e = new BasicDeliverEventArgs();
142+
e.ConsumerTag = consumerTag;
143+
e.DeliveryTag = deliveryTag;
144+
e.Redelivered = redelivered;
145+
e.Exchange = exchange;
146+
e.RoutingKey = routingKey;
147+
e.BasicProperties = properties;
148+
e.Body = body;
149+
ProcessSingleDelivery(e);
150+
151+
if (Encoding.UTF8.GetString(body) == "quit") {
152+
Console.WriteLine("Quitting!");
153+
this.OnCancel();
154+
}
155+
}
156+
}
157+
158+
public static void ProcessSingleDelivery(BasicDeliverEventArgs e) {
159+
Console.WriteLine("Delivery =========================================");
160+
DebugUtil.DumpProperties(e, Console.Out, 0);
161+
Console.WriteLine("----------------------------------------");
162+
163+
if (e.BasicProperties.ContentType == MapMessageReader.MimeType) {
164+
IMapMessageReader r = new MapMessageReader(e.BasicProperties, e.Body);
165+
DebugUtil.DumpProperties(r.Body, Console.Out, 0);
166+
} else if (e.BasicProperties.ContentType == StreamMessageReader.MimeType) {
167+
IStreamMessageReader r = new StreamMessageReader(e.BasicProperties, e.Body);
168+
while (true) {
169+
try {
170+
object v = r.ReadObject();
171+
Console.WriteLine("("+v.GetType()+") "+v);
172+
} catch (EndOfStreamException) {
173+
break;
174+
}
175+
}
176+
} else {
177+
// No special content-type. Already covered by the DumpProperties above.
178+
}
179+
180+
Console.WriteLine("==================================================");
181+
}
182+
}
183+
}

0 commit comments

Comments
 (0)