<html><head>
<meta http-equiv="content-type" content="text/html; charset=us-ascii">
<title>Fault-tolerant subscriptions using the .NET client</title>
</head><body>Greetings Rabbiters,<br>
<br>
I'm
 currently working on a system which is using RabbitMQ as the hub of message
 transfers. One of the scenarios we are using it for is to funnel masses of 
data from the web into an SQL database. The messages are passed to the 
queues via an Erlang web application. We have a series of .NET services 
running which are subscribed to the queues and they take the messages as 
they come in and write them to an MS SQL back-end.<br>
<br>
What I would like 
to do is handle the case where the connection between RabbitMQ and the 
subscriber is broken for some reason but something other than the .NET 
client terminating the connection. For example, if RabbitMQ is stopped 
manually, a netsplit happens, etc. I want the .NET client to know that there
 has been a connection failure so that the connection and subscription can 
be reestablished.<br>
<br>
In my .NET code, I do something like the following to get the connection
set up:<br>
<br>
ConnectionFactory cf = ...;<br>
var conn = cf.CreateConnection();<br>
var model = conn.CreateModel();<br>
model.ExchangeDeclare(exchange, exchangeType);<br>
model.QueueDeclare(queueName);<br>
model.QueueBind(queueName, exchange, routeKey, false, null);<br>
var subscription = new Subscription(model, queueName);<br>
<br>
I then have a worker thread which essentially does the following (over and
over):<br>
<br>
&#160;&#160;&#160;&#160;&#160;&#160;&#160; private BasicDeliverEventArgs
GetNextMessage()<br>
&#160;&#160;&#160;&#160;&#160;&#160;&#160; {<br>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; var
eventArgs = default(BasicDeliverEventArgs);<br>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if
(!subscripion.Next(500, out eventArgs))<br>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {<br>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<span title="s
t"></span>&#160;&#160;&#160; eventArgs = null;<br>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return
eventArgs;<br>
&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br>
<br>
When
 a valid eventArgs instance is returned, the message is processed. Otherwise
 it a few other things. The reason it's doing this is so that if the service
 is paused using the service manager, then the code has the chance to stop 
looking for messages. When restarted, this GetNextMessage() is then called 
again a loop. There are other things that the thread might need to do as 
well, but that's basically the gist of it.<br>
<br>
So at this point, all is well. Everything works just fine and the messages
come through nicely (and insanely quick to boot).<br>
<br>
If
 I simulate a network issue by stopping the RabbitMQ server, the subscriber 
is not informed about the connection loss. Even if the worker thread 
continues polling the subscription, no errors are reported at all. The only 
time an error is indicated is when the connection is closed (an IOException 
is thrown). Obviously this isn't helpful because until we attempt to close 
the service down we assume that the connection is up and hence wouldn't have
 any indication that there are connectivity issues.<br>
<br>
What I would like
 to do is put something in place which is able to detect a connection 
failure and get things working again. I was wondering if anyone had any 
insights into the best way to approach this problem. Is there something in 
the .NET client that I am not configuring properly to enable certain 
behaviours? Should I have something else running which is checking to see if
 it can establish connections and hence detect issues that way?<br>
<br>
What's the best approach?<br>
<br>
Many thanks for your time.<br>
Best regards<br>
OJ<br>
<br clear="all">
<br>
-- <br>
<br>
OJ Reeves<br>
http://buffered.io/<br>
</body></html>