<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" version="2.0">
  <channel>
    <title>Clemens Vasters - Technology|MSMQ</title>
    <link>http://vasters.com/clemensv/</link>
    <description>Cloud Development and Alien Abductions</description>
    <language>en-us</language>
    <copyright>Clemens Vasters</copyright>
    <lastBuildDate>Mon, 19 Sep 2011 02:15:26 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 1.9.7067.0</generator>
    <managingEditor>cvasters@guhhome.com</managingEditor>
    <webMaster>cvasters@guhhome.com</webMaster>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=44c95cba-0951-4f92-96e2-1366b516f72c</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,44c95cba-0951-4f92-96e2-1366b516f72c.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,44c95cba-0951-4f92-96e2-1366b516f72c.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=44c95cba-0951-4f92-96e2-1366b516f72c</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
This session is a followup to the Service Bus session <a href="http://vasters.com/clemensv/2011/09/16/Building+Looselycoupled+Apps+With+Windows+Azure+Service+Bus+Topics+And+Queues.aspx">that
I did at the build conference</a> and explains advanced usage patterns:
</p>
        <p>
          <iframe style="WIDTH: 512px; HEIGHT: 288px" src="http://channel9.msdn.com/posts/ServiceBusTopicsAndQueues/player?w=512&amp;h=288" frameborder="0" scrolling="no">
          </iframe>
        </p>
        <img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=44c95cba-0951-4f92-96e2-1366b516f72c" />
      </body>
      <title>Service Bus Topics and Queues &amp;ndash; Advanced</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,44c95cba-0951-4f92-96e2-1366b516f72c.aspx</guid>
      <link>http://vasters.com/clemensv/2011/09/19/Service+Bus+Topics+And+Queues+Ndash+Advanced.aspx</link>
      <pubDate>Mon, 19 Sep 2011 02:15:26 GMT</pubDate>
      <description>&lt;p&gt;
This session is a followup to the Service Bus session &lt;a href="http://vasters.com/clemensv/2011/09/16/Building+Looselycoupled+Apps+With+Windows+Azure+Service+Bus+Topics+And+Queues.aspx"&gt;that
I did at the build conference&lt;/a&gt; and explains advanced usage patterns:
&lt;/p&gt;
&lt;p&gt;
&lt;iframe style="WIDTH: 512px; HEIGHT: 288px" src="http://channel9.msdn.com/posts/ServiceBusTopicsAndQueues/player?w=512&amp;amp;h=288" frameborder=0 scrolling=no&gt;
&lt;/iframe&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=44c95cba-0951-4f92-96e2-1366b516f72c" /&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,44c95cba-0951-4f92-96e2-1366b516f72c.aspx</comments>
      <category>.NET Services</category>
      <category>AppFabric</category>
      <category>Azure</category>
      <category>Talks</category>
      <category>Technology/MSMQ</category>
      <category>Technology/Web Services</category>
    </item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=b44ee538-4b3d-4d20-a265-9ec7d7b2c7f3</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,b44ee538-4b3d-4d20-a265-9ec7d7b2c7f3.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,b44ee538-4b3d-4d20-a265-9ec7d7b2c7f3.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=b44ee538-4b3d-4d20-a265-9ec7d7b2c7f3</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
For programmers writing distributed systems and are not using queues in them just
yet. If you are a message-oriented middleware veteran - move along ;-)
</p>
        <object width="400" height="224">
          <param name="allowfullscreen" value="true" />
          <param name="movie" value="http://www.facebook.com/v/10150174116899187" />
          <embed src="http://www.facebook.com/v/10150174116899187" type="application/x-shockwave-flash" allowfullscreen="true" width="400" height="224">
          </embed>
        </object>
        <img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=b44ee538-4b3d-4d20-a265-9ec7d7b2c7f3" />
      </body>
      <title>Why would anyone ever use a (Message) Queue?</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,b44ee538-4b3d-4d20-a265-9ec7d7b2c7f3.aspx</guid>
      <link>http://vasters.com/clemensv/2011/03/19/Why+Would+Anyone+Ever+Use+A+Message+Queue.aspx</link>
      <pubDate>Sat, 19 Mar 2011 05:04:39 GMT</pubDate>
      <description>&lt;p&gt;
For programmers writing distributed systems and are not using queues in them just
yet. If you are a message-oriented middleware veteran - move along ;-)
&lt;/p&gt;
&lt;object width="400" height="224" &gt;
&lt;param name="allowfullscreen" value="true" /&gt;
&lt;param name="movie" value="http://www.facebook.com/v/10150174116899187" /&gt;&lt;embed src="http://www.facebook.com/v/10150174116899187" type="application/x-shockwave-flash" allowfullscreen="true" width="400" height="224"&gt;&lt;/embed&gt;
&lt;/object&gt;&lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=b44ee538-4b3d-4d20-a265-9ec7d7b2c7f3" /&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,b44ee538-4b3d-4d20-a265-9ec7d7b2c7f3.aspx</comments>
      <category>Technology</category>
      <category>Technology/MSMQ</category>
    </item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=46106a0e-05a7-4e4b-b156-0331d1c9aa57</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,46106a0e-05a7-4e4b-b156-0331d1c9aa57.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,46106a0e-05a7-4e4b-b156-0331d1c9aa57.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=46106a0e-05a7-4e4b-b156-0331d1c9aa57</wfw:commentRss>
      <title>Poison Control.</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,46106a0e-05a7-4e4b-b156-0331d1c9aa57.aspx</guid>
      <link>http://vasters.com/clemensv/2007/03/29/Poison+Control.aspx</link>
      <pubDate>Thu, 29 Mar 2007 08:02:54 GMT</pubDate>
      <description>&lt;p&gt;
A bad sign for how much I’m coding these days is that I had a HDD crash three weeks
ago and only restored Visual Studio into fully working condition with all my tools
and stuff today. I’ve decided that that has to change otherwise I’ll get really rusty.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://blogs.msdn.com/drnick/archive/2007/02/13/more-poison-message-handling.aspx"&gt;Picking
up&lt;/a&gt; the thread from “Professor Indigo” Nicholas Allen, I’ve built a little program
that illustrates an alternate handling strategy for poisonous messages that WCF throws
into the poison queue on Vista and Longhorn Server if you ask it to (&lt;a href="http://msdn2.microsoft.com/en-us/library/system.servicemodel.receiveerrorhandling.aspx"&gt;ReceiveErrorHandling.Move&lt;/a&gt;).
The one we’re &lt;a href="http://msdn2.microsoft.com/en-us/library/ms789028.aspx"&gt;showing
in the docs&lt;/a&gt; is implementing a local resolution strategy that’s being fired within
the service when the service ends up faulting; that’s the strategy for &lt;a href="http://msdn2.microsoft.com/en-us/library/system.servicemodel.configuration.msmqbindingelementbase.receiveerrorhandling.aspx"&gt;ReceiveErrorHandling.Fault&lt;/a&gt; and
works for MSMQ 3.0. The strategy I’m showing here requires our latest OS wave.
&lt;/p&gt;
&lt;p&gt;
When a message arrives at a WCF endpoint through a queue, WCF will – if the queue
is transactional – open a transaction and de-queue the message. It will then try to
dispatch it to the target service and operation. Assuming the dispatch works, the
operation gets invoked and – might – tank. If it does, an exception is raised, thrown
back into the WCF stack and the transaction aborts. Happily, WCF grabs the next message
from the queue – which happens to be the one that just caused the failure due to the
rollback – and the operation – might – tank again.
&lt;/p&gt;
&lt;p&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;
Now, the reasons why the operation might fail are as numerous as the combinations
of program statement combinations that you could put there. Anything could happen.
The program is completely broken, the input data causes the app to go to that branch
that nobody ever cared to test – or apparently not enough, the backend database is
permanently offline, the machine is having an extremely bad hardware day, power fails,
you name it. 
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/p&gt;
&lt;p&gt;
So what if the application just keeps choking and throwing on that particular message?
With either of the aforementioned error handling modes, WCF is going to take the message
out of the loop when its patience with the patient is exhausted. With the &lt;a href="http://msdn2.microsoft.com/en-us/library/system.servicemodel.configuration.msmqbindingelementbase.receiveerrorhandling.aspx"&gt;ReceiveErrorHandling.Fault&lt;/a&gt; option,
WCF will raise an error event that can be caught and processed with &lt;a href="http://msdn2.microsoft.com/en-us/library/ms789028.aspx"&gt;a
handler&lt;/a&gt;. When you use &lt;a href="http://msdn2.microsoft.com/en-us/library/system.servicemodel.receiveerrorhandling.aspx"&gt;ReceiveErrorHandling.Move&lt;/a&gt; things
are a bit more flexible, because the message causing all that trouble now sits in
a queue again.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/p&gt;
&lt;p&gt;
The headache-causing problem with poison messages is that you really, really need
to do something about them. From the sender’s perspective, the message has been delivered
and it puts its trust into the receiver to do the right thing. “Here’s that $1,000,000
purchase order! I’m done, go party!”. If the receiving service goes into the bug-induced
loop of recurring death, you’ve got two problems: You have a nasty bug that’s probably
difficult to repro since it happens under stress, and you’ve got a $1,000,000 purchase
order unhappily sitting in a dark hole. Guess what your great-grand-boss’ boss cares
more about.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/p&gt;
&lt;p&gt;
The second, technically slightly more headache-causing problem with poison messages
(if that’s possible to imagine) is that they just sit there with all the gold and
diamonds that they might represent, but they are effectively just a bunch of (if you’re
lucky) XML goo. Telling a system operator to go and check the poison message queues
or to surface their contents to him/her and look what’s going on there is probably
not a winning strategy.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/p&gt;
&lt;p&gt;
So what to do? Your high-throughput automated-processing solution that does the regular
business behind the queue has left the building for lunch. That much is clear. How
do you hook in some alternate processing path that does at least surface the problem
to an operator or “information worker”– or even a call center agent pool – in a legible
and intelligible fashion so that a human can look at the problem and try finding a
fix? In the end, we’ve got the best processing unit for non-deterministic and unexpected
events sitting &lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/span&gt;between our shoulders,
one would hope. How about writing a slightly less automated service alternative that’s
easy to adjust and try to get the issue surfaced to someone or just try multiple things
[Did someone just say “Workflow”?] – and hook that straight up to where all the bad
stuff lands: the poison queue. 
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/p&gt;
&lt;p&gt;
Here’s the code. I just coded that up for illustrative purposes and hence there’s
absolutely room for improvement. I’m going to put the project files up on wcf.netfx3.com
and will update this post with the link. We’ll start with the boilerplate stuff and
the “regular” service: 
&lt;p&gt;
&lt;table class=MsoTableGrid style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-yfti-tbllook: 1184; mso-padding-alt: 0in 5.4pt 0in 5.4pt" cellspacing=0 cellpadding=0 border=1&gt;
&lt;tbody&gt;
&lt;tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes; mso-yfti-lastrow: yes"&gt;
&lt;td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: black 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: black 1pt solid; WIDTH: 8.65in; PADDING-TOP: 0in; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid black .5pt; mso-border-themecolor: text1" valign=top width=830&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;using&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;font color=#000000&gt; System;&lt;br&gt;
&lt;/font&gt;&lt;span style="COLOR: blue"&gt;using&lt;/span&gt;&lt;font color=#000000&gt; System.Collections.Generic;&lt;br&gt;
&lt;/font&gt;&lt;span style="COLOR: blue"&gt;using&lt;/span&gt;&lt;font color=#000000&gt; System.Text;&lt;br&gt;
&lt;/font&gt;&lt;span style="COLOR: blue"&gt;using&lt;/span&gt;&lt;font color=#000000&gt; System.ServiceModel.Channels;&lt;br&gt;
&lt;/font&gt;&lt;span style="COLOR: blue"&gt;using&lt;/span&gt;&lt;font color=#000000&gt; System.ServiceModel;&lt;br&gt;
&lt;/font&gt;&lt;span style="COLOR: blue"&gt;using&lt;/span&gt;&lt;font color=#000000&gt; System.Runtime.Serialization;&lt;br&gt;
&lt;/font&gt;&lt;span style="COLOR: blue"&gt;using&lt;/span&gt;&lt;font color=#000000&gt; System.ServiceModel.Description;&lt;br&gt;
&lt;/font&gt;&lt;span style="COLOR: blue"&gt;using&lt;/span&gt;&lt;font color=#000000&gt; System.Workflow.Runtime;&lt;br&gt;
&lt;/font&gt;&lt;span style="COLOR: blue"&gt;using&lt;/span&gt;&lt;font color=#000000&gt; ServerErrorHandlingWorkflow;&lt;br&gt;
&lt;/font&gt;&lt;span style="COLOR: blue"&gt;using&lt;/span&gt;&lt;font color=#000000&gt; ServerData;&lt;br&gt;
&lt;br&gt;
&lt;/font&gt;&lt;span style="COLOR: blue"&gt;namespace&lt;/span&gt;&lt;font color=#000000&gt; Server&lt;br&gt;
{&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;[&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;ServiceContract&lt;/span&gt;&lt;font color=#000000&gt;(Namespace=&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;Program&lt;/span&gt;&lt;font color=#000000&gt;.ServiceNamespaceURI)]&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;span style="COLOR: blue"&gt;interface&lt;/span&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;IApplicationContract&lt;br&gt;
&lt;/span&gt;&lt;font color=#000000&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;[&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;OperationContract&lt;/span&gt;&lt;font color=#000000&gt;(IsOneWay=&lt;/font&gt;&lt;span style="COLOR: blue"&gt;true&lt;/span&gt;&lt;font color=#000000&gt;)]&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;span style="COLOR: blue"&gt;void&lt;/span&gt;&lt;font color=#000000&gt; SubmitData(&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;ApplicationData&lt;/span&gt;&lt;font color=#000000&gt; data);&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;[&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;ServiceBehavior&lt;/span&gt;&lt;font color=#000000&gt;(TransactionAutoCompleteOnSessionClose=&lt;/font&gt;&lt;span style="COLOR: blue"&gt;true&lt;/span&gt;&lt;font color=#000000&gt;,&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/span&gt;ReleaseServiceInstanceOnTransactionComplete=&lt;/font&gt;&lt;span style="COLOR: blue"&gt;true&lt;/span&gt;&lt;font color=#000000&gt;)]&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;span style="COLOR: blue"&gt;class&lt;/span&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;ApplicationService&lt;/span&gt;&lt;font color=#000000&gt; : &lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;IApplicationContract&lt;br&gt;
&lt;/span&gt;&lt;font color=#000000&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;[&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;OperationBehavior&lt;/span&gt;&lt;font color=#000000&gt;(TransactionAutoComplete=&lt;/font&gt;&lt;span style="COLOR: blue"&gt;true&lt;/span&gt;&lt;font color=#000000&gt;,TransactionScopeRequired=&lt;/font&gt;&lt;span style="COLOR: blue"&gt;true&lt;/span&gt;&lt;font color=#000000&gt;),&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/span&gt;System.Diagnostics.&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;DebuggerStepThrough&lt;/span&gt;&lt;font color=#000000&gt;]&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;span style="COLOR: blue"&gt;public&lt;/span&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;span style="COLOR: blue"&gt;void&lt;/span&gt;&lt;font color=#000000&gt; SubmitData(&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;ApplicationData&lt;/span&gt;&lt;font color=#000000&gt; data)&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;span style="BACKGROUND: yellow; COLOR: blue; mso-highlight: yellow"&gt;throw&lt;/span&gt;&lt;span style="BACKGROUND: yellow; mso-highlight: yellow"&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;span style="COLOR: blue"&gt;new&lt;/span&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;Exception&lt;/span&gt;&lt;font color=#000000&gt;(&lt;/font&gt;&lt;span style="COLOR: #a31515"&gt;"The
method or operation is not implemented."&lt;/span&gt;&lt;font color=#000000&gt;);&lt;/font&gt;&lt;/span&gt;
&lt;br&gt;
&lt;font color=#000000&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/p&gt;
&lt;p&gt;
Not much excitement here except that the highlighted line will always cause the service
to tank. In real life, the path to that particular place where the service consistently
finds its way into a trouble-spot is more convoluted and may involve a few thousand
lines, but this is a good approximation for what happens when you hit a poison message.
Stuff keeps failing.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/p&gt;
&lt;p&gt;
The next snippet is our alternate service. Instead of boldly trying to do complex
processing, it simply punts the message data to a Workflow. That’s assuming that the
message isn’t completely messed up to begin with and can indeed be de-serialized.
To mitigate that scenario we could also use a one-way &lt;a href="http://msdn.microsoft.com/msdnmag/issues/07/04/ServiceStation/default.aspx#S8"&gt;universal
contract&lt;/a&gt; and be even more careful. The key difference between this and the “regular”
service is that the alternate service turns off the WCF address filter check. We’ll
get back to that.&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;table class=MsoTableGrid style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-yfti-tbllook: 1184; mso-padding-alt: 0in 5.4pt 0in 5.4pt" cellspacing=0 cellpadding=0 border=1&gt;
&lt;tbody&gt;
&lt;tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes; mso-yfti-lastrow: yes"&gt;
&lt;td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: black 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: black 1pt solid; WIDTH: 8.65in; PADDING-TOP: 0in; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid black .5pt; mso-border-themecolor: text1" valign=top width=830&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;
&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="BACKGROUND: aqua; mso-highlight: aqua"&gt;&lt;font color=#000000&gt;[&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;ServiceBehavior&lt;/span&gt;&lt;font color=#000000&gt;(AddressFilterMode
= &lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;AddressFilterMode&lt;/span&gt;&lt;font color=#000000&gt;.Any)]&lt;/font&gt;&lt;/span&gt;
&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR: blue"&gt;class&lt;/span&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;ApplicationErrorService&lt;/span&gt;&lt;font color=#000000&gt; : &lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;IApplicationContract&lt;br&gt;
&lt;/span&gt;&lt;font color=#000000&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;span style="COLOR: blue"&gt;public&lt;/span&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;span style="COLOR: blue"&gt;void&lt;/span&gt;&lt;font color=#000000&gt; SubmitData(&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;ApplicationData&lt;/span&gt;&lt;font color=#000000&gt; data)&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;Dictionary&lt;/span&gt;&lt;font color=#000000&gt;&amp;lt;&lt;/font&gt;&lt;span style="COLOR: blue"&gt;string&lt;/span&gt;&lt;font color=#000000&gt;,&lt;/font&gt;&lt;span style="COLOR: blue"&gt;object&lt;/span&gt;&lt;font color=#000000&gt;&amp;gt;
workflowArgs = &lt;/font&gt;&lt;span style="COLOR: blue"&gt;new&lt;/span&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;Dictionary&lt;/span&gt;&lt;font color=#000000&gt;&amp;lt;&lt;/font&gt;&lt;span style="COLOR: blue"&gt;string&lt;/span&gt;&lt;font color=#000000&gt;,&lt;/font&gt;&lt;span style="COLOR: blue"&gt;object&lt;/span&gt;&lt;font color=#000000&gt;&amp;gt;();&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;workflowArgs.Add(&lt;/font&gt;&lt;span style="COLOR: #a31515"&gt;"ApplicationData"&lt;/span&gt;&lt;font color=#000000&gt;,data);&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;WorkflowInstance&lt;/span&gt;&lt;font color=#000000&gt; workflowInstance
= 
&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;Program&lt;/span&gt;&lt;font color=#000000&gt;.WorkflowRuntime.CreateWorkflow(&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;span style="COLOR: blue"&gt;typeof&lt;/span&gt;&lt;font color=#000000&gt;(&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;ErrorHandlingWorkflow&lt;/span&gt;&lt;font color=#000000&gt;), 
&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;workflowArgs);&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;workflowInstance.Start();&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;}&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/p&gt;
&lt;p&gt;
So now we’ve got the fully automated middle-of-the-road default service and our “what
do we do next” alternate service. Let’s hook them up.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;table class=MsoTableGrid style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-yfti-tbllook: 1184; mso-padding-alt: 0in 5.4pt 0in 5.4pt" cellspacing=0 cellpadding=0 border=1&gt;
&lt;tbody&gt;
&lt;tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes; mso-yfti-lastrow: yes"&gt;
&lt;td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: black 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: black 1pt solid; WIDTH: 8.65in; PADDING-TOP: 0in; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid black .5pt; mso-border-themecolor: text1" valign=top width=830&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR: blue"&gt;class&lt;/span&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;Program&lt;br&gt;
&lt;/span&gt;&lt;font color=#000000&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;span style="COLOR: blue"&gt;public&lt;/span&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;span style="COLOR: blue"&gt;const&lt;/span&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;span style="COLOR: blue"&gt;string&lt;/span&gt;&lt;font color=#000000&gt; ServiceNamespaceURI
= 
&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;span style="COLOR: #a31515"&gt;"http://samples.microsoft.com/2007/03/WCF/PoisonHandling/Service"&lt;/span&gt;&lt;font color=#000000&gt;;&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;span style="COLOR: blue"&gt;public&lt;/span&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;span style="COLOR: blue"&gt;static&lt;/span&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;WorkflowRuntime&lt;/span&gt;&lt;font color=#000000&gt; WorkflowRuntime
= &lt;/font&gt;&lt;span style="COLOR: blue"&gt;new&lt;/span&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;WorkflowRuntime&lt;/span&gt;&lt;font color=#000000&gt;();&lt;br&gt;
&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;span style="COLOR: blue"&gt;static&lt;/span&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;span style="COLOR: blue"&gt;void&lt;/span&gt;&lt;font color=#000000&gt; Main(&lt;/font&gt;&lt;span style="COLOR: blue"&gt;string&lt;/span&gt;&lt;font color=#000000&gt;[]
args)&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;span style="COLOR: blue"&gt;string&lt;/span&gt;&lt;font color=#000000&gt; msmqQueueName
= Properties.&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;Settings&lt;/span&gt;&lt;font color=#000000&gt;.Default.QueueName;&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;span style="COLOR: blue"&gt;string&lt;/span&gt;&lt;font color=#000000&gt; msmqPoisonQueueName
= msmqQueueName+&lt;/font&gt;&lt;span style="COLOR: #a31515"&gt;";poison"&lt;/span&gt;&lt;font color=#000000&gt;;&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;span style="COLOR: blue"&gt;string&lt;/span&gt;&lt;font color=#000000&gt; &lt;span style="BACKGROUND: fuchsia; mso-highlight: fuchsia"&gt;netMsmqQueueName&lt;/span&gt; = 
&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;span style="COLOR: #a31515"&gt;"net.msmq://"&lt;/span&gt;&lt;font color=#000000&gt; +
msmqQueueName.Replace(&lt;/font&gt;&lt;span style="COLOR: #a31515"&gt;'\\'&lt;/span&gt;&lt;font color=#000000&gt;, &lt;/font&gt;&lt;span style="COLOR: #a31515"&gt;'/'&lt;/span&gt;&lt;font color=#000000&gt;).Replace(&lt;/font&gt;&lt;span style="COLOR: #a31515"&gt;"$"&lt;/span&gt;&lt;font color=#000000&gt;,&lt;/font&gt;&lt;span style="COLOR: #a31515"&gt;""&lt;/span&gt;&lt;font color=#000000&gt;);&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;span style="COLOR: blue"&gt;string&lt;/span&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;span style="BACKGROUND: lime; mso-highlight: lime"&gt;&lt;font color=#000000&gt;netMsmqPoisonQueueName
= netMsmqQueueName+&lt;/font&gt;&lt;span style="COLOR: #a31515"&gt;";poison"&lt;/span&gt;&lt;font color=#000000&gt;;&lt;/font&gt;&lt;/span&gt;
&lt;br&gt;
&lt;font color=#000000&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;
&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;span style="COLOR: blue"&gt;if&lt;/span&gt;&lt;font color=#000000&gt; (!System.Messaging.&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;MessageQueue&lt;/span&gt;&lt;font color=#000000&gt;.Exists(msmqQueueName))&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;System.Messaging.&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;MessageQueue&lt;/span&gt;&lt;font color=#000000&gt;.Create(msmqQueueName, &lt;/font&gt;&lt;span style="COLOR: blue"&gt;true&lt;/span&gt;&lt;font color=#000000&gt;);&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/p&gt;
&lt;p&gt;
First – and for this little demo only – we’re setting up a local queue and do a little
stringsmithing to get the app.config stored MSMQ format queue name into the net.msmq
URI format. Next …&lt;font face=Calibri&gt;&lt;font color=#000000&gt;&lt;font size=3&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;table class=MsoTableGrid style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-yfti-tbllook: 1184; mso-padding-alt: 0in 5.4pt 0in 5.4pt" cellspacing=0 cellpadding=0 border=1&gt;
&lt;tbody&gt;
&lt;tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes; mso-yfti-lastrow: yes"&gt;
&lt;td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: black 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: black 1pt solid; WIDTH: 8.65in; PADDING-TOP: 0in; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid black .5pt; mso-border-themecolor: text1" valign=top width=830&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR: #2b91af"&gt;ServiceHost&lt;/span&gt;&lt;font color=#000000&gt; applicationServiceHost
= &lt;/font&gt;&lt;span style="COLOR: blue"&gt;new&lt;/span&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;ServiceHost&lt;/span&gt;&lt;font color=#000000&gt;(&lt;/font&gt;&lt;span style="COLOR: blue"&gt;typeof&lt;/span&gt;&lt;font color=#000000&gt;(&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;ApplicationService&lt;/span&gt;&lt;font color=#000000&gt;));&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;NetMsmqBinding&lt;/span&gt;&lt;font color=#000000&gt; queueBinding
= &lt;/font&gt;&lt;span style="COLOR: blue"&gt;new&lt;/span&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;NetMsmqBinding&lt;/span&gt;&lt;font color=#000000&gt;(&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;NetMsmqSecurityMode&lt;/span&gt;&lt;font color=#000000&gt;.None);&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;queueBinding.ReceiveErrorHandling
= &lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;ReceiveErrorHandling&lt;/span&gt;&lt;font color=#000000&gt;.Move; 
&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;queueBinding.ReceiveRetryCount
= 1;&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;queueBinding.RetryCycleDelay
= &lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;TimeSpan&lt;/span&gt;&lt;font color=#000000&gt;.FromSeconds(1);&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;applicationServiceHost.AddServiceEndpoint(&lt;/font&gt;&lt;span style="COLOR: blue"&gt;typeof&lt;/span&gt;&lt;font color=#000000&gt;(&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;IApplicationContract&lt;/span&gt;&lt;font color=#000000&gt;),&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;queueBinding,&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="BACKGROUND: fuchsia; mso-highlight: fuchsia"&gt;netMsmqQueueName&lt;/span&gt;);&lt;br style="mso-special-character: line-break"&gt;
&lt;br style="mso-special-character: line-break"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/p&gt;
&lt;p&gt;
Now we’ve bound the “regular” application service to the queue. I’m setting the binding
parameters (look them up at your leisure) in a way that we’re failing very fast here.
By default, the RetryCycleDelay is set to 30 minutes, which means that WCF is giving
you a reasonable chance to fix temporary issues while stuff hangs out in the retry
queue. Now for the poison handler service:&lt;o:p&gt;&lt;/o:p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;table class=MsoTableGrid style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-yfti-tbllook: 1184; mso-padding-alt: 0in 5.4pt 0in 5.4pt" cellspacing=0 cellpadding=0 border=1&gt;
&lt;tbody&gt;
&lt;tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes; mso-yfti-lastrow: yes"&gt;
&lt;td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: black 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: black 1pt solid; WIDTH: 8.65in; PADDING-TOP: 0in; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid black .5pt; mso-border-themecolor: text1" valign=top width=830&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;
&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;ServiceHost&lt;/span&gt;&lt;font color=#000000&gt; poisonHandlerServiceHost
= &lt;/font&gt;&lt;span style="COLOR: blue"&gt;new&lt;/span&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;ServiceHost&lt;/span&gt;&lt;font color=#000000&gt;(&lt;/font&gt;&lt;span style="COLOR: blue"&gt;typeof&lt;/span&gt;&lt;font color=#000000&gt;(&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;ApplicationErrorService&lt;/span&gt;&lt;font color=#000000&gt;));&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;NetMsmqBinding&lt;/span&gt;&lt;font color=#000000&gt; poisonBinding
= &lt;/font&gt;&lt;span style="COLOR: blue"&gt;new&lt;/span&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;NetMsmqBinding&lt;/span&gt;&lt;font color=#000000&gt;(&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;NetMsmqSecurityMode&lt;/span&gt;&lt;font color=#000000&gt;.None);&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;poisonBinding.ReceiveErrorHandling
= &lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;ReceiveErrorHandling&lt;/span&gt;&lt;font color=#000000&gt;.Drop;&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;poisonHandlerServiceHost.AddServiceEndpoint(&lt;/font&gt;&lt;span style="COLOR: blue"&gt;typeof&lt;/span&gt;&lt;font color=#000000&gt;(&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;IApplicationContract&lt;/span&gt;&lt;font color=#000000&gt;), 
&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;poisonBinding, 
&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="BACKGROUND: lime; mso-highlight: lime"&gt;netMsmqPoisonQueueName&lt;/span&gt;);&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/p&gt;
&lt;p&gt;
Looks almost the same, hmm? The trick here is that we’re pointing this one to the
poison queue into which the regular service drops all the stuff that it can’t deal
with. Otherwise it’s (almost) just a normal service. The key difference between the
ApplicationErrorService service and its sibling is that the poison-message handler
service implementation is decorated with &lt;span style="FONT-SIZE: 10pt; BACKGROUND: aqua; FONT-FAMILY: 'Courier New'; mso-no-proof: yes; mso-highlight: aqua"&gt;&lt;font color=#000000&gt;[&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;ServiceBehavior&lt;/span&gt;&lt;font color=#000000&gt;(AddressFilterMode
= &lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;AddressFilterMode&lt;/span&gt;&lt;font color=#000000&gt;.Any)]&lt;/font&gt;&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;.&lt;/span&gt;Since
the original message was sent to the a different (the original) queue and we’re now
looking at a sub-queue that has a different name and therefore a different WS-Addressing:To
identity, WCF would normally reject processing that message. With this behavior setting
we can tell WCF to ignore that and have the service treat the message as if it landed
at the right place – which is what we want.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/p&gt;
&lt;p&gt;
And now for the unspectacular run-it and drop-a-message-into-queue finale:&lt;font face=Calibri&gt;&lt;font color=#000000&gt;&lt;font size=3&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;table class=MsoTableGrid style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-yfti-tbllook: 1184; mso-padding-alt: 0in 5.4pt 0in 5.4pt" cellspacing=0 cellpadding=0 border=1&gt;
&lt;tbody&gt;
&lt;tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes; mso-yfti-lastrow: yes"&gt;
&lt;td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: black 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: black 1pt solid; WIDTH: 8.65in; PADDING-TOP: 0in; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid black .5pt; mso-border-themecolor: text1" valign=top width=830&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;applicationServiceHost.Open();&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;poisonHandlerServiceHost.Open();&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;
&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;Console&lt;/span&gt;&lt;font color=#000000&gt;.WriteLine(&lt;/font&gt;&lt;span style="COLOR: #a31515"&gt;"Application
running"&lt;/span&gt;&lt;font color=#000000&gt;);&lt;br&gt;
&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;ChannelFactory&lt;/span&gt;&lt;font color=#000000&gt;&amp;lt;&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;IApplicationContract&lt;/span&gt;&lt;font color=#000000&gt;&amp;gt;
client = 
&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;span style="COLOR: blue"&gt;new &lt;/span&gt;&lt;span style="COLOR: #2b91af"&gt;ChannelFactory&lt;/span&gt;&lt;font color=#000000&gt;&amp;lt;&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;IApplicationContract&lt;/span&gt;&lt;font color=#000000&gt;&amp;gt;(queueBinding,&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;netMsmqQueueName);&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;IApplicationContract&lt;/span&gt;&lt;font color=#000000&gt; channel
= client.CreateChannel();&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;ApplicationData&lt;/span&gt;&lt;font color=#000000&gt; data
= &lt;/font&gt;&lt;span style="COLOR: blue"&gt;new&lt;/span&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;ApplicationData&lt;/span&gt;&lt;font color=#000000&gt;();&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;data.FirstName
= &lt;/font&gt;&lt;span style="COLOR: #a31515"&gt;"Clemens"&lt;/span&gt;&lt;font color=#000000&gt;;&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;data.LastName
= &lt;/font&gt;&lt;span style="COLOR: #a31515"&gt;"Vasters"&lt;/span&gt;&lt;font color=#000000&gt;;&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;channel.SubmitData(data);&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;
&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;((&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;IClientChannel&lt;/span&gt;&lt;font color=#000000&gt;)channel).Close();&lt;br&gt;
&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;Console&lt;/span&gt;&lt;font color=#000000&gt;.WriteLine(&lt;/font&gt;&lt;span style="COLOR: #a31515"&gt;"Press
ENTER to exit"&lt;/span&gt;&lt;font color=#000000&gt;);&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;
&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;span style="COLOR: #2b91af"&gt;Console&lt;/span&gt;&lt;font color=#000000&gt;.ReadLine();&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;br&gt;
&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;br&gt;
}&lt;/font&gt;&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/p&gt;
&lt;p&gt;
The Workflow that’s hooked up to the poison handler in my particular sample project
does nothing big. It’s got a property that is initialized with the data item and just
has a code activity that spits out the message to the console. It could send an email,
page an operator through messenger, etcetc. Whatever works. 
&lt;/p&gt;
&lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=46106a0e-05a7-4e4b-b156-0331d1c9aa57" /&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,46106a0e-05a7-4e4b-b156-0331d1c9aa57.aspx</comments>
      <category>Technology/MSMQ</category>
      <category>Technology/WCF</category>
    </item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=e75402c6-bdd6-438c-9bf2-31f64b8e0557</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,e75402c6-bdd6-438c-9bf2-31f64b8e0557.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,e75402c6-bdd6-438c-9bf2-31f64b8e0557.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=e75402c6-bdd6-438c-9bf2-31f64b8e0557</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I just got <a href="http://friends.newtelligence.net/clemensv/CommentView,guid,b99db04c-f2d0-4850-8d9f-8048608ea7cd.aspx">a
comment</a> from Oran about the lack of durable messaging in WCF and the need for
a respective extensibility point. Well... the thing is: Durable messaging is there;
use the MSMQ bindings. One of the obvious "problems" with durable messaging that's
only based on WS-ReliableMessaging is that that spec (intentionally) does not
make any assertions about the behavior of the respective endpoints. 
</p>
        <p>
There is no rule saying: "the received message MUST be written do disk". WS-ReliableMessaging
is as reliable (and unreliable in case of very long-lasting network failures or an
endpoint outright crashing) and plays the same role as TCP. The mapping is actually
pretty straightforward like this: WS-Addressing = IP, WS-ReliableMessaging = TCP. 
</p>
        <p>
So if you do durable messaging on one end and the other end doesn't do it, the sum
of the gained reliability doesn't add up to anything more than it was before. MSMQ
is fully in control of both ends of the wire and makes assertions about the endpoint
behavior and was therefore the logical choice for our durable messaging strategy in
V1, because it already ships with Windows and there is (as of yet) no agreed interoperable
set of behavioral assertions for WS-RM around how endpoints must deal with received
messages except ACKing them.
</p>
        <p>
See <a href="http://blogs.msdn.com/shycohen/archive/2006/02/20/535717.aspx">Shy's
comments</a>.
</p>
        <img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=e75402c6-bdd6-438c-9bf2-31f64b8e0557" />
      </body>
      <title>The case of the missing "durable messaging" feature</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,e75402c6-bdd6-438c-9bf2-31f64b8e0557.aspx</guid>
      <link>http://vasters.com/clemensv/2006/02/20/The+Case+Of+The+Missing+Durable+Messaging+Feature.aspx</link>
      <pubDate>Mon, 20 Feb 2006 20:13:32 GMT</pubDate>
      <description>&lt;p&gt;
I just got&amp;nbsp;&lt;a href="http://friends.newtelligence.net/clemensv/CommentView,guid,b99db04c-f2d0-4850-8d9f-8048608ea7cd.aspx"&gt;a
comment&lt;/a&gt; from Oran about the lack of durable messaging in WCF and the need for
a respective extensibility point. Well... the thing is: Durable messaging is there;
use the MSMQ bindings. One of the&amp;nbsp;obvious "problems"&amp;nbsp;with durable messaging&amp;nbsp;that's
only based on&amp;nbsp;WS-ReliableMessaging is that that spec (intentionally) does not
make any assertions about the behavior of the respective&amp;nbsp;endpoints. 
&lt;/p&gt;
&lt;p&gt;
There is no rule saying: "the received message MUST be written do disk". WS-ReliableMessaging
is as reliable (and unreliable in case of&amp;nbsp;very long-lasting&amp;nbsp;network failures&amp;nbsp;or&amp;nbsp;an
endpoint outright crashing)&amp;nbsp;and plays the same role as TCP. The mapping is actually
pretty straightforward like this: WS-Addressing = IP, WS-ReliableMessaging = TCP. 
&lt;/p&gt;
&lt;p&gt;
So if you do durable messaging on one end and the other end doesn't do it, the sum
of the gained reliability doesn't add up to anything more than it was before. MSMQ
is fully in control of both ends of the wire and makes assertions about the endpoint
behavior and was therefore the logical choice for our durable messaging strategy in
V1, because it already ships with Windows and&amp;nbsp;there is&amp;nbsp;(as of yet) no agreed&amp;nbsp;interoperable
set of behavioral assertions for WS-RM around how endpoints must deal with received
messages except ACKing them.
&lt;/p&gt;
&lt;p&gt;
See &lt;a href="http://blogs.msdn.com/shycohen/archive/2006/02/20/535717.aspx"&gt;Shy's
comments&lt;/a&gt;.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=e75402c6-bdd6-438c-9bf2-31f64b8e0557" /&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,e75402c6-bdd6-438c-9bf2-31f64b8e0557.aspx</comments>
      <category>Technology/Indigo</category>
      <category>Technology/MSMQ</category>
    </item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=84227eea-d685-4f0b-bc7b-1b0e3637666d</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,84227eea-d685-4f0b-bc7b-1b0e3637666d.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,84227eea-d685-4f0b-bc7b-1b0e3637666d.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=84227eea-d685-4f0b-bc7b-1b0e3637666d</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
The stack trace below (snapshot taken at a breakpoint in [WebMethod] "HelloWorld") shows
that I am having quite a bit of programming fun these days. Server-side ASP.NET hooked
up to a MSMQ listener.  
</p>
        <p>
          <font size="1">
            <em>
              <strong>simpleservicerequestinweb.dll!SimpleServiceRequestInWeb.Hello.HelloWorld()
Line 53 C#<br /></strong>
            </em>system.web.services.dll!System.Web.Services.Protocols.LogicalMethodInfo.Invoke(System.Object
target, System.Object[] values) + 0x92 bytes <br />
system.web.services.dll!System.Web.Services.Protocols.WebServiceHandler.Invoke() +
0x9e bytes <br />
system.web.services.dll!System.Web.Services.Protocols.WebServiceHandler.CoreProcessRequest()
+ 0x142 bytes <br />
system.web.services.dll!System.Web.Services.Protocols.SyncSessionlessHandler.ProcessRequest(System.Web.HttpContext
context) + 0x6 bytes <br />
system.web.dll!CallHandlerExecutionStep.System.Web.HttpApplication+IExecutionStep.Execute()
+ 0xb4 bytes <br />
system.web.dll!System.Web.HttpApplication.ExecuteStep(System.Web.HttpApplication.IExecutionStep
step, bool completedSynchronously) + 0x58 bytes <br />
system.web.dll!System.Web.HttpApplication.ResumeSteps(System.Exception error) + 0xfa
bytes <br />
system.web.dll!System.Web.HttpApplication.System.Web.IHttpAsyncHandler.BeginProcessRequest(System.Web.HttpContext
context, System.AsyncCallback cb, System.Object extraData) + 0xe3 bytes <br />
system.web.dll!System.Web.HttpRuntime.ProcessRequestInternal(System.Web.HttpWorkerRequest
wr) + 0x1e7 bytes <br />
system.web.dll!System.Web.HttpRuntime.ProcessRequest(System.Web.HttpWorkerRequest
wr) + 0xb0 bytes <br /></font>
          <em>
            <font size="1">
              <strong>newtelligence.enterprisetools.dll!newtelligence.EnterpriseTools.Msmq.MessageQueueAsmxDispatcher.MessageReceived(System.Object
sender = {newtelligence.EnterpriseTools.Msmq.MessageQueueListener}, newtelligence.EnterpriseTools.Msmq.MessageReceivedEventArgs
ea = {newtelligence.EnterpriseTools.Msmq.MessageReceivedEventArgs}) Line 33 C#<br />
newtelligence.enterprisetools.dll!newtelligence.EnterpriseTools.Msmq.MessageQueueListener.ReceiveLoop()
Line 305 + 0x2b bytes C#<br /></strong>
            </font>
          </em>
        </p>
        <img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=84227eea-d685-4f0b-bc7b-1b0e3637666d" />
      </body>
      <title>A Fun Stack Trace</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,84227eea-d685-4f0b-bc7b-1b0e3637666d.aspx</guid>
      <link>http://vasters.com/clemensv/2004/12/11/A+Fun+Stack+Trace.aspx</link>
      <pubDate>Sat, 11 Dec 2004 14:35:43 GMT</pubDate>
      <description>&lt;p&gt;
The stack trace below (snapshot taken at a breakpoint in [WebMethod] "HelloWorld")&amp;nbsp;shows
that I am having quite a bit of programming fun these days. Server-side ASP.NET hooked
up to a MSMQ listener.&amp;nbsp;&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&lt;font size=1&gt;&lt;em&gt;&lt;strong&gt;simpleservicerequestinweb.dll!SimpleServiceRequestInWeb.Hello.HelloWorld()
Line 53&amp;nbsp;C#&lt;br&gt;
&lt;/strong&gt;&lt;/em&gt;system.web.services.dll!System.Web.Services.Protocols.LogicalMethodInfo.Invoke(System.Object
target, System.Object[] values) + 0x92 bytes&amp;nbsp;&lt;br&gt;
system.web.services.dll!System.Web.Services.Protocols.WebServiceHandler.Invoke() +
0x9e bytes&amp;nbsp;&lt;br&gt;
system.web.services.dll!System.Web.Services.Protocols.WebServiceHandler.CoreProcessRequest()
+ 0x142 bytes&amp;nbsp;&lt;br&gt;
system.web.services.dll!System.Web.Services.Protocols.SyncSessionlessHandler.ProcessRequest(System.Web.HttpContext
context) + 0x6 bytes&amp;nbsp;&lt;br&gt;
system.web.dll!CallHandlerExecutionStep.System.Web.HttpApplication+IExecutionStep.Execute()
+ 0xb4 bytes&amp;nbsp;&lt;br&gt;
system.web.dll!System.Web.HttpApplication.ExecuteStep(System.Web.HttpApplication.IExecutionStep
step, bool completedSynchronously) + 0x58 bytes&amp;nbsp;&lt;br&gt;
system.web.dll!System.Web.HttpApplication.ResumeSteps(System.Exception error) + 0xfa
bytes&amp;nbsp;&lt;br&gt;
system.web.dll!System.Web.HttpApplication.System.Web.IHttpAsyncHandler.BeginProcessRequest(System.Web.HttpContext
context, System.AsyncCallback cb, System.Object extraData) + 0xe3 bytes&amp;nbsp;&lt;br&gt;
system.web.dll!System.Web.HttpRuntime.ProcessRequestInternal(System.Web.HttpWorkerRequest
wr) + 0x1e7 bytes&amp;nbsp;&lt;br&gt;
system.web.dll!System.Web.HttpRuntime.ProcessRequest(System.Web.HttpWorkerRequest
wr) + 0xb0 bytes&amp;nbsp;&lt;br&gt;
&lt;/font&gt;&lt;em&gt;&lt;font size=1&gt;&lt;strong&gt;newtelligence.enterprisetools.dll!newtelligence.EnterpriseTools.Msmq.MessageQueueAsmxDispatcher.MessageReceived(System.Object
sender = {newtelligence.EnterpriseTools.Msmq.MessageQueueListener}, newtelligence.EnterpriseTools.Msmq.MessageReceivedEventArgs
ea = {newtelligence.EnterpriseTools.Msmq.MessageReceivedEventArgs}) Line 33&amp;nbsp;C#&lt;br&gt;
newtelligence.enterprisetools.dll!newtelligence.EnterpriseTools.Msmq.MessageQueueListener.ReceiveLoop()
Line 305 + 0x2b bytes&amp;nbsp;C#&lt;br&gt;
&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&gt;&lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=84227eea-d685-4f0b-bc7b-1b0e3637666d" /&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,84227eea-d685-4f0b-bc7b-1b0e3637666d.aspx</comments>
      <category>Technology/ASP.NET</category>
      <category>Technology/MSMQ</category>
      <category>Technology/Web Services</category>
    </item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=21f5bd19-f334-462c-94f6-af00c82b7614</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,21f5bd19-f334-462c-94f6-af00c82b7614.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,21f5bd19-f334-462c-94f6-af00c82b7614.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=21f5bd19-f334-462c-94f6-af00c82b7614</wfw:commentRss>
      <slash:comments>3</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <div class="Section1">
          <p class="MsoNormal">
            <span style="FONT-SIZE: 10pt; FONT-FAMILY: Tahoma">
              <a href="http://staff.newtelligence.net/clemensv/PermaLink.aspx?guid=3a83d7c0-cded-46f7-a6a6-b6450d66fb56">See
Part 3</a>
            </span>
          </p>
          <p class="MsoNormal">
            <span style="FONT-SIZE: 10pt; FONT-FAMILY: Tahoma">In <a href="http://staff.newtelligence.net/clemensv/PermaLink.aspx?guid=3a83d7c0-cded-46f7-a6a6-b6450d66fb56">Part
3</a>, I illustrated a simple strategy to re-run a “repeatable” transaction
using a simple “while” loop. A better and more fault resilient way of
handling such cases (we are talking about transactions, after all) is to employ a
transactional resource manager such as MSMQ from which to retrieve the transaction
input. If the transaction fails due to a catastrophic failure (power outage or worse),
an in-memory recovery strategy like the one shown in “RunTx()” will not
get us very far. Instead, we will put the transaction input into a transactional queue,
read it from the queue using a specialized message queue listener and equip that listener
with some handling logic that is similar to what is shown in the “RunTx()”
example.</span>
          </p>
          <p class="MsoNormal">
            <span style="FONT-SIZE: 10pt; FONT-FAMILY: Tahoma">Before I will show that, however,
I will give you a generic, multi-threaded message queue listener that is not transaction
aware (in the desired way) and which I will specialize in Part 5 (the last part) of
this series. The reasons that I post the message listener logic in two steps are that
(a) you might find a generic listener useful, (b) it is quite a bit of code and I
don’t want the “essentials” of the recovery code to be buried amongst
the basic queue listener framework, and (c) I am simply too lazy today to explain
it all ;-)</span>
          </p>
          <p class="MsoNormal">
            <span style="FONT-SIZE: 10pt; FONT-FAMILY: Tahoma">Using this queue listener is pretty
straightforward and should be rather self-explanatory. To listen, create an instance
of the listener using one of the constructors and supply a “queueName”
argument that is compatible with the System.Messaging.MessageQueue class. The queue
must exist. The listener will bubble messages to the MessageReceived delegate (“unicast
event”), which you must implement in your class and assign to the listener in
order to get at the messages.</span>
            <span style="FONT-SIZE: 10pt; FONT-FAMILY: Tahoma">
            </span>
          </p>
          <table class="MsoNormalTable" style="BACKGROUND: #e6e6e6; WIDTH: 100%; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" width="100%" border="0">
            <tbody>
              <tr>
                <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: windowtext 1pt solid; WIDTH: 6.15in; PADDING-TOP: 0in; BORDER-BOTTOM: windowtext 1pt solid" valign="top" width="590">
                  <p class="MsoNormal">
                    <span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Lucida Console'">MessageQueueListener
queueListener = <span style="COLOR: blue">new</span> MessageQueueListener(sourceQueuePath,
4 );<br />
queueListener.MessageReceived = <span style="COLOR: blue">new</span> MessageReceivedEventHandler(queueListener
MessageReceived);<br />
queueListener.ProcessingError += <span style="COLOR: blue">new</span> ProcessingErrorEventHandler(queueListener
ProcessingError);<br />
queueListener.Start();</span>
                  </p>
                </td>
              </tr>
            </tbody>
          </table>
          <p class="MsoNormal">
            <span style="FONT-SIZE: 10pt; FONT-FAMILY: Tahoma">And here are 344 lines of pure
developer joy:</span>
          </p>
          <table class="MsoNormalTable" style="BACKGROUND: #e6e6e6; WIDTH: 100%; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" width="100%" border="0">
            <tbody>
              <tr>
                <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: windowtext 1pt solid; WIDTH: 1168.45pt; PADDING-TOP: 0in; BORDER-BOTTOM: windowtext 1pt solid" valign="top" width="1558">
                  <p class="MsoNormal">
                    <span style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Lucida Console'">using</span>
                    <span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Lucida Console'"> System;<br /><span style="COLOR: blue">using</span> System.Collections;<br /><span style="COLOR: blue">using</span> System.Messaging;<br /><span style="COLOR: blue">using</span> System.Threading;<br /><br /><span style="COLOR: blue">namespace</span> newtelligence.EnterpriseTools.Msmq<br />
{<br />
    <span style="COLOR: gray">///</span><span style="COLOR: green"></span><span style="COLOR: gray">&lt;summary&gt;<br /></span>    <span style="COLOR: gray">///</span><span style="COLOR: green"> Event
argument class for the MessageQueueListener.MessageReceived unicast event<br /></span>    <span style="COLOR: gray">///</span><span style="COLOR: green"></span><span style="COLOR: gray">&lt;/summary&gt;<br /></span>    <span style="COLOR: blue">public</span><span style="COLOR: blue">class</span> MessageReceivedEventArgs
: EventArgs<br />
    {<br />
        <span style="COLOR: blue">private</span> Message
receivedMessage;<br /><br />
        <span style="COLOR: gray">///</span><span style="COLOR: green"></span><span style="COLOR: gray">&lt;summary&gt;<br /></span>        <span style="COLOR: gray">///</span><span style="COLOR: green"> Constructor<br /></span>        <span style="COLOR: gray">///</span><span style="COLOR: green"></span><span style="COLOR: gray">&lt;/summary&gt;<br /></span>        <span style="COLOR: gray">///</span><span style="COLOR: green"></span><span style="COLOR: gray">&lt;param
name="receivedMessage"&gt;</span><span style="COLOR: green">A message</span><span style="COLOR: gray">&lt;/param&gt;<br /></span>        <span style="COLOR: blue">public</span> MessageReceivedEventArgs(
Message receivedMessage )<br />
        {<br />
           <span style="COLOR: blue">this</span>.receivedMessage
= receivedMessage; 
<br />
        }<br /><br />
        <span style="COLOR: gray">///</span><span style="COLOR: green"></span><span style="COLOR: gray">&lt;summary&gt;<br /></span>        <span style="COLOR: gray">///</span><span style="COLOR: green"> Received
message<br /></span>        <span style="COLOR: gray">///</span><span style="COLOR: green"></span><span style="COLOR: gray">&lt;/summary&gt;<br /></span>        <span style="COLOR: blue">public</span> Message
ReceivedMessage<br />
        {<br />
            <span style="COLOR: blue">get<br /></span>            {<br />
                <span style="COLOR: blue">return</span> receivedMessage;<br />
            }<br />
        }<br />
    }<br /><br />
    <span style="COLOR: gray">///</span><span style="COLOR: green"></span><span style="COLOR: gray">&lt;summary&gt;<br /></span>    <span style="COLOR: gray">///</span><span style="COLOR: green"> Event
argument class for the MessageQueueListener.ProcessingError event<br /></span>    <span style="COLOR: gray">///</span><span style="COLOR: green"></span><span style="COLOR: gray">&lt;/summary&gt;<br /></span>    <span style="COLOR: blue">public</span><span style="COLOR: blue">class</span> ProcessingErrorEventArgs
: EventArgs<br />
    {<br />
        <span style="COLOR: gray">///</span><span style="COLOR: green"></span><span style="COLOR: gray">&lt;summary&gt;<br /></span>        <span style="COLOR: gray">///</span><span style="COLOR: green"><br /></span>        <span style="COLOR: gray">///</span><span style="COLOR: green"></span><span style="COLOR: gray">&lt;/summary&gt;<br /></span>        <span style="COLOR: blue">private</span> Exception
exception;<br /><br />
        <span style="COLOR: gray">///</span><span style="COLOR: green"></span><span style="COLOR: gray">&lt;summary&gt;<br /></span>        <span style="COLOR: gray">///</span><span style="COLOR: green"> Constructor<br /></span>        <span style="COLOR: gray">///</span><span style="COLOR: green"></span><span style="COLOR: gray">&lt;/summary&gt;<br /></span>        <span style="COLOR: gray">///</span><span style="COLOR: green"></span><span style="COLOR: gray">&lt;param
name="exception"&gt;</span><span style="COLOR: green">An exception</span><span style="COLOR: gray">&lt;/param&gt;<br /></span>        <span style="COLOR: blue">public</span> ProcessingErrorEventArgs(
Exception exception )<br />
        {<br />
            <span style="COLOR: blue">this</span>.exception
= exception;<br />
        }<br /><br />
        <span style="COLOR: gray">///</span><span style="COLOR: green"></span><span style="COLOR: gray">&lt;summary&gt;<br /></span>        <span style="COLOR: gray">///</span><span style="COLOR: green"> Intercepted
exception<br /></span>        <span style="COLOR: gray">///</span><span style="COLOR: green"></span><span style="COLOR: gray">&lt;/summary&gt;<br /></span>        <span style="COLOR: blue">public</span> Exception
Exception<br />
        {<br />
            <span style="COLOR: blue">get<br /></span>            {<br />
                <span style="COLOR: blue">return</span> exception;<br />
            }<br />
        }<br />
    }<br /><br />
    <span style="COLOR: gray">///</span><span style="COLOR: green"></span><span style="COLOR: gray">&lt;summary&gt;<br /></span>    <span style="COLOR: gray">///</span><span style="COLOR: green"> Delegate
for the MessageQueueListener.MessageReceived unicast event<br /></span>    <span style="COLOR: gray">///</span><span style="COLOR: green"></span><span style="COLOR: gray">&lt;/summary&gt;<br /></span>    <span style="COLOR: blue">public</span><span style="COLOR: blue">delegate</span><span style="COLOR: blue">void</span> MessageReceivedEventHandler( <span style="COLOR: blue">object</span> sender,
MessageReceivedEventArgs ea );<br />
    <span style="COLOR: gray">///</span><span style="COLOR: green"></span><span style="COLOR: gray">&lt;summary&gt;<br /></span>    <span style="COLOR: gray">///</span><span style="COLOR: green"> Delegate
for the MessageQueueListener.ProcessingError event<br /></span>    <span style="COLOR: gray">///</span><span style="COLOR: green"></span><span style="COLOR: gray">&lt;/summary&gt;<br /></span>    <span style="COLOR: blue">public</span><span style="COLOR: blue">delegate</span><span style="COLOR: blue">void</span> ProcessingErrorEventHandler( <span style="COLOR: blue">object</span> sender,
ProcessingErrorEventArgs ea );<br />
    
<br />
    <span style="COLOR: gray">///</span><span style="COLOR: green"></span><span style="COLOR: gray">&lt;summary&gt;<br /></span>    <span style="COLOR: gray">///</span><span style="COLOR: green"> This
class implements a multi-threaded message queue listener<br /></span>    <span style="COLOR: gray">///</span><span style="COLOR: green"></span><span style="COLOR: gray">&lt;/summary&gt;<br /></span>    <span style="COLOR: blue">public</span><span style="COLOR: blue">class</span> MessageQueueListener<br />
    {<br />
        <span style="COLOR: blue">protected</span> Guid
instanceId = Guid.NewGuid();<br />
        <span style="COLOR: blue">protected</span> Thread[]
listenerThreads;<br />
        <span style="COLOR: blue">protected</span><span style="COLOR: blue">string</span> queueName=<span style="COLOR: blue">null</span>;<br />
        <span style="COLOR: blue">protected</span><span style="COLOR: blue">int</span> numThreads=1;<br />
        <span style="COLOR: blue">protected</span> ThreadPriority
priority=ThreadPriority.Normal;<br />
        <span style="COLOR: blue">protected</span> ManualResetEvent
continueInterrupt = <span style="COLOR: blue">new</span> ManualResetEvent(<span style="COLOR: blue">true</span>);<br />
        <span style="COLOR: blue">protected</span> ManualResetEvent
pauseInterrupt = <span style="COLOR: blue">new</span> ManualResetEvent(<span style="COLOR: blue">false</span>);<br />
        <span style="COLOR: blue">protected</span> ManualResetEvent
stopInterrupt = <span style="COLOR: blue">new</span> ManualResetEvent(<span style="COLOR: blue">false</span>);<br />
        <span style="COLOR: blue">protected</span><span style="COLOR: blue">int</span> peekTimeout
= 5;<br />
        <span style="COLOR: blue">protected</span> MessageReceivedEventHandler
messageReceived;<br />
        <span style="COLOR: blue">protected</span><span style="COLOR: blue">int</span> refCount
= 0;<br />
        
<br />
        <span style="COLOR: gray">///</span><span style="COLOR: green"></span><span style="COLOR: gray">&lt;summary&gt;<br /></span>        <span style="COLOR: gray">///</span><span style="COLOR: green"> Initializes
a new instance of the MessageQueueListener class<br /></span>        <span style="COLOR: gray">///</span><span style="COLOR: green"></span><span style="COLOR: gray">&lt;/summary&gt;<br /></span>        <span style="COLOR: gray">///</span><span style="COLOR: green"></span><span style="COLOR: gray">&lt;param
name="queueName"&gt;</span><span style="COLOR: green">Message name where listener
waits messages</span><span style="COLOR: gray">&lt;/param&gt;<br /></span>        <span style="COLOR: blue">public</span> MessageQueueListener(<span style="COLOR: blue">string</span> queueName)<br />
        {<br />
            queueName = queueName; 
<br />
            Initialize();<br />
        }<br /><br />
        <span style="COLOR: gray">///</span><span style="COLOR: green"></span><span style="COLOR: gray">&lt;summary&gt;<br /></span>        <span style="COLOR: gray">///</span><span style="COLOR: green"> Initializes
a new instance of the MessageQueueListener class<br /></span>        <span style="COLOR: gray">///</span><span style="COLOR: green"></span><span style="COLOR: gray">&lt;/summary&gt;<br /></span>        <span style="COLOR: gray">///</span><span style="COLOR: green"></span><span style="COLOR: gray">&lt;param
name="queueName"&gt;</span><span style="COLOR: green">Name of the queue to listen
on</span><span style="COLOR: gray">&lt;/param&gt;<br /></span>        <span style="COLOR: gray">///</span><span style="COLOR: green"></span><span style="COLOR: gray">&lt;param
name="numThreads"&gt;</span><span style="COLOR: green">Number of threads to run the
listener on</span><span style="COLOR: gray">&lt;/param&gt;<br /></span>        <span style="COLOR: blue">public</span> MessageQueueListener(<span style="COLOR: blue">string</span> queueName, <span style="COLOR: blue">int</span> numThreads)<br />
        {<br />
            queueName = queueName; 
<br />
            numThreads = numThreads;<br />
            Initialize();<br />
        }<br /><br /><br />
        <span style="COLOR: gray">///</span><span style="COLOR: green"></span><span style="COLOR: gray">&lt;summary&gt;<br /></span>        <span style="COLOR: gray">///</span><span style="COLOR: green"> Initializes
a new instance of the MessageQueueListener class<br /></span>        <span style="COLOR: gray">///</span><span style="COLOR: green"></span><span style="COLOR: gray">&lt;/summary&gt;<br /></span>        <span style="COLOR: gray">///</span><span style="COLOR: green"></span><span style="COLOR: gray">&lt;param
name="queueName"&gt;</span><span style="COLOR: green">Name of the queue to listen
on</span><span style="COLOR: gray">&lt;/param&gt;<br /></span>        <span style="COLOR: gray">///</span><span style="COLOR: green"></span><span style="COLOR: gray">&lt;param
name="numThreads"&gt;</span><span style="COLOR: green">Number of threads run the listener
on</span><span style="COLOR: gray">&lt;/param&gt;<br /></span>        <span style="COLOR: gray">///</span><span style="COLOR: green"></span><span style="COLOR: gray">&lt;param
name="priority"&gt;</span><span style="COLOR: green">Thread priority</span><span style="COLOR: gray">&lt;/param&gt;<br /></span>        <span style="COLOR: blue">public</span> MessageQueueListener(<span style="COLOR: blue">string</span> queueName, <span style="COLOR: blue">int</span> numThreads,
ThreadPriority priority)<br />
        {<br />
            queueName = queueName; 
<br />
            numThreads = numThreads;<br />
            priority = priority;<br />
            Initialize();<br />
        }<br /><br /><br />
        <span style="COLOR: gray">///</span><span style="COLOR: green"></span><span style="COLOR: gray">&lt;summary&gt;<br /></span>        <span style="COLOR: gray">///</span><span style="COLOR: green"> Adds
a reference to the reference counter.<br /></span>        <span style="COLOR: gray">///</span><span style="COLOR: green"></span><span style="COLOR: gray">&lt;/summary&gt;<br /></span>        <span style="COLOR: gray">///</span><span style="COLOR: green"></span><span style="COLOR: gray">&lt;returns&gt;</span><span style="COLOR: green">Current
reference count</span><span style="COLOR: gray">&lt;/returns&gt;<br /></span>        <span style="COLOR: blue">public</span><span style="COLOR: blue">int</span> AddReference()<br />
        {<br />
            <span style="COLOR: blue">return</span> ++
refCount;<br />
        }<br /><br />
        <span style="COLOR: gray">///</span><span style="COLOR: green"></span><span style="COLOR: gray">&lt;summary&gt;<br /></span>        <span style="COLOR: gray">///</span><span style="COLOR: green"> Releases
a reference from the reference counter.<br /></span>        <span style="COLOR: gray">///</span><span style="COLOR: green"></span><span style="COLOR: gray">&lt;/summary&gt;<br /></span>        <span style="COLOR: gray">///</span><span style="COLOR: green"></span><span style="COLOR: gray">&lt;returns&gt;</span><span style="COLOR: green">Current
reference count</span><span style="COLOR: gray">&lt;/returns&gt;<br /></span>        <span style="COLOR: gray">///</span><span style="COLOR: green"></span><span style="COLOR: gray">&lt;remarks&gt;</span><span style="COLOR: green">If
the reference counter drops to or below zero, the listener is stopped.</span><span style="COLOR: gray">&lt;/remarks&gt;<br /></span>        <span style="COLOR: blue">public</span><span style="COLOR: blue">int</span> ReleaseReference()<br />
        {<br />
            <span style="COLOR: blue">if</span> (
-- refCount &lt;= 0 )<br />
            {<br />
               
Stop();<br />
            }<br />
            <span style="COLOR: blue">return</span> refCount;<br />
        }<br /><br />
        <span style="COLOR: gray">///</span><span style="COLOR: green"></span><span style="COLOR: gray">&lt;summary&gt;<br /></span>        <span style="COLOR: gray">///</span><span style="COLOR: green"> Initializes
the MessageQueueListener<br /></span>        <span style="COLOR: gray">///</span><span style="COLOR: green"></span><span style="COLOR: gray">&lt;/summary&gt;<br /></span>        <span style="COLOR: blue">protected</span><span style="COLOR: blue">virtual</span><span style="COLOR: blue">void</span> Initialize()<br />
        {<br />
            listenerThreads
= <span style="COLOR: blue">new</span> Thread[ numThreads];<br />
        }<br /><br />
        <span style="COLOR: gray">///</span><span style="COLOR: green"></span><span style="COLOR: gray">&lt;summary&gt;<br /></span>        <span style="COLOR: gray">///</span><span style="COLOR: green"> Unicast
event that is raised when a message has been received<br /></span>        <span style="COLOR: gray">///</span><span style="COLOR: green"></span><span style="COLOR: gray">&lt;/summary&gt;<br /></span>        <span style="COLOR: blue">public</span> MessageReceivedEventHandler
MessageReceived<br />
        {<br />
            <span style="COLOR: blue">get<br /></span>            {<br />
                <span style="COLOR: blue">return</span> messageReceived;<br />
            }<br />
            <span style="COLOR: blue">set<br /></span>            {<br />
                <span style="COLOR: blue">if</span> (
messageReceived == <span style="COLOR: blue">value</span>)<br />
                    <span style="COLOR: blue">return</span>;<br />
                
messageReceived = <span style="COLOR: blue">value</span>;<br />
            }<br />
        }<br /><br />
        <span style="COLOR: gray">///</span><span style="COLOR: green"></span><span style="COLOR: gray">&lt;summary&gt;<br /></span>        <span style="COLOR: gray">///</span><span style="COLOR: green"> Multicast
event that is raised when an exception occurs during processing.<br /></span>        <span style="COLOR: gray">///</span><span style="COLOR: green"></span><span style="COLOR: gray">&lt;/summary&gt;<br /></span>        <span style="COLOR: blue">public</span><span style="COLOR: blue">event</span> ProcessingErrorEventHandler
ProcessingError;<br /><br />
        <span style="COLOR: gray">///</span><span style="COLOR: green"></span><span style="COLOR: gray">&lt;summary&gt;<br /></span>        <span style="COLOR: gray">///</span><span style="COLOR: green"> Raises
the ProcessingError event<br /></span>        <span style="COLOR: gray">///</span><span style="COLOR: green"></span><span style="COLOR: gray">&lt;/summary&gt;<br /></span>        <span style="COLOR: gray">///</span><span style="COLOR: green"></span><span style="COLOR: gray">&lt;param
name="pea"&gt;&lt;/param&gt;<br /></span>        <span style="COLOR: blue">protected</span><span style="COLOR: blue">void</span> OnProcessingError(
ProcessingErrorEventArgs pea )<br />
        {<br />
            <span style="COLOR: blue">if</span> (ProcessingError
!= <span style="COLOR: blue">null</span> )<br />
            {<br />
               
ProcessingError( <span style="COLOR: blue">this</span>, pea );<br />
            }<br />
        }<br /><br />
        <span style="COLOR: gray">///</span><span style="COLOR: green"></span><span style="COLOR: gray">&lt;summary&gt;<br /></span>        <span style="COLOR: gray">///</span><span style="COLOR: green"> Starts
the message queue listener. If the threads are already running,<br /></span>        <span style="COLOR: gray">///</span><span style="COLOR: green"> Start()
does nothing.<br /></span>        <span style="COLOR: gray">///</span><span style="COLOR: green"></span><span style="COLOR: gray">&lt;/summary&gt;<br /></span>        <span style="COLOR: blue">public</span><span style="COLOR: blue">void</span> Start()<br />
        {<br />
            <span style="COLOR: blue">for</span>(<span style="COLOR: blue">int</span> i=0;i&lt;
numThreads;i++)<br />
            {<br />
                <span style="COLOR: blue">if</span> (
listenerThreads[i] == <span style="COLOR: blue">null</span> )<br />
               
{<br />
                   
Thread thread = <span style="COLOR: blue">new</span> Thread(<span style="COLOR: blue">new</span> ThreadStart(<span style="COLOR: blue">this</span>.ReceiveLoop));<br />
                 
  thread.Name = String.Format("{0}:{1}:{2}",i, instanceId,GetType().Name);<br />
                   
thread.IsBackground = <span style="COLOR: blue">true</span>;<br />
                   
thread.Priority = priority;<br />
                   
listenerThreads[i] = thread;<br />
                   
thread.Start();<br />
               
}<br />
            }<br />
        }<br /><br />
        <span style="COLOR: gray">///</span><span style="COLOR: green"></span><span style="COLOR: gray">&lt;summary&gt;<br /></span>        <span style="COLOR: gray">///</span><span style="COLOR: green"> Set
listener state in stop<br /></span>        <span style="COLOR: gray">///</span><span style="COLOR: green"></span><span style="COLOR: gray">&lt;/summary&gt;<br /></span>        <span style="COLOR: blue">public</span><span style="COLOR: blue">void</span> Stop()<br />
        {<br />
            Resume();<br />
            stopInterrupt.Set();<br />
            <span style="COLOR: blue">for</span>(<span style="COLOR: blue">int</span> i=0;i&lt;
numThreads;i++)<br />
            {<br />
               
listenerThreads[i].Join();<br />
               
listenerThreads[i] = <span style="COLOR: blue">null</span>;<br />
            }<br />
        }<br /><br />
        <span style="COLOR: gray">///</span><span style="COLOR: green"></span><span style="COLOR: gray">&lt;summary&gt;<br /></span>        <span style="COLOR: gray">///</span><span style="COLOR: green"> Set
listener state to "paused". 
<br /></span>        <span style="COLOR: gray">///</span><span style="COLOR: green"></span><span style="COLOR: gray">&lt;/summary&gt;<br /></span>        <span style="COLOR: gray">///</span><span style="COLOR: green"></span><span style="COLOR: gray">&lt;remarks&gt;<br /></span>        <span style="COLOR: gray">///</span><span style="COLOR: green"> Setting
the listener ito the "paused" state will not suspend processing<br /></span>        <span style="COLOR: gray">///</span><span style="COLOR: green"> immediately.
All messages that are currently being processed will be 
<br /></span>        <span style="COLOR: gray">///</span><span style="COLOR: green"> processed,
but no new messages are being dequeued.<br /></span>        <span style="COLOR: gray">///</span><span style="COLOR: green"></span><span style="COLOR: gray">&lt;/remarks&gt;<br /></span>        <span style="COLOR: blue">public</span><span style="COLOR: blue">void</span> Pause()<br />
        {<br />
            continueInterrupt.Reset();<br />
            pauseInterrupt.Set();                             
<br />
        }<br /><br />
        <span style="COLOR: gray">///</span><span style="COLOR: green"></span><span style="COLOR: gray">&lt;summary&gt;<br /></span>        <span style="COLOR: gray">///</span><span style="COLOR: green"> Set
listener state to "resume". This will resume the listener from<br /></span>        <span style="COLOR: gray">///</span><span style="COLOR: green"> the
"paused" state.<br /></span>        <span style="COLOR: gray">///</span><span style="COLOR: green"></span><span style="COLOR: gray">&lt;/summary&gt;<br /></span>        <span style="COLOR: blue">public</span><span style="COLOR: blue">void</span> Resume()<br />
        {<br />
            pauseInterrupt.Reset();<br />
            continueInterrupt.Set();            
<br />
        }<br /><br />
        <span style="COLOR: gray">///</span><span style="COLOR: green"></span><span style="COLOR: gray">&lt;summary&gt;<br /></span>        <span style="COLOR: gray">///</span><span style="COLOR: green"> Gets
a value indicating whether the listener is paused.<br /></span>        <span style="COLOR: gray">///</span><span style="COLOR: green"></span><span style="COLOR: gray">&lt;/summary&gt;<br /></span>        <span style="COLOR: blue">public</span><span style="COLOR: blue">bool</span> IsPaused<br />
        {<br />
            <span style="COLOR: blue">get<br /></span>            {<br />
                <span style="COLOR: blue">return</span> pauseInterrupt.WaitOne(TimeSpan.Zero,<span style="COLOR: blue">false</span>);<br />
            }<br />
        }<br /><br />
        <span style="COLOR: gray">///</span><span style="COLOR: green"></span><span style="COLOR: gray">&lt;summary&gt;<br /></span>        <span style="COLOR: gray">///</span><span style="COLOR: green"> Gets
a value indicating whether the listener is paused.<br /></span>        <span style="COLOR: gray">///</span><span style="COLOR: green"></span><span style="COLOR: gray">&lt;/summary&gt;<br /></span>        <span style="COLOR: blue">public</span><span style="COLOR: blue">bool</span> IsStopping<br />
        {<br />
            <span style="COLOR: blue">get<br /></span>            {<br />
                <span style="COLOR: blue">return</span> stopInterrupt.WaitOne(TimeSpan.Zero,<span style="COLOR: blue">false</span>);<br />
            }<br />
        }<br /><br /><br />
        <span style="COLOR: gray">///</span><span style="COLOR: green"></span><span style="COLOR: gray">&lt;summary&gt;<br /></span>        <span style="COLOR: gray">///</span><span style="COLOR: green"> This
is the thread entry point for the main receive loop.<br /></span>        <span style="COLOR: gray">///</span><span style="COLOR: green"></span><span style="COLOR: gray">&lt;/summary&gt;<br /></span>        <span style="COLOR: blue">protected</span><span style="COLOR: blue">virtual</span><span style="COLOR: blue">void</span> ReceiveLoop()<br />
        {<br />
            <span style="COLOR: blue">using</span> (MessageQueue
sourceQueue = <span style="COLOR: blue">new</span> MessageQueue( queueName, <span style="COLOR: blue">false</span> ))<br />
            {<br />
                <span style="COLOR: blue">bool</span> isTransactional
= sourceQueue.Transactional;<br /><font size="2">               
sourceQueue.MessageReadPropertyFilter.SetAll();<br /></font></span>
                    <span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Lucida Console'">
                      <br />
                <span style="COLOR: blue">while</span> (
!IsStopping )<br />
               
{<br />
                    <span style="COLOR: green">//
if the continue interrupt is not set, we will hang here<br /></span>                    <span style="COLOR: green">//
until it is set again (resuming)<br /></span>                   
WaitHandle.WaitAny(<span style="COLOR: blue">new</span> WaitHandle[]{ continueInterrupt,
stopInterrupt});<br /><br />
                    <span style="COLOR: blue">try<br /></span>                   
{<br />
                        <span style="COLOR: green">//peek
on the queue and wait for a message becoming available<br /></span>                       
IAsyncResult asynchResult = sourceQueue.BeginPeek(TimeSpan.FromSeconds( peekTimeout),<span style="COLOR: blue">null</span>,<span style="COLOR: blue">null</span>);<br />
                        <span style="COLOR: blue">int</span> firedWaitHandle
= WaitHandle.WaitAny(<span style="COLOR: blue">new</span> WaitHandle[]{asynchResult.AsyncWaitHandle,
pauseInterrupt, stopInterrupt});<br />
                        <span style="COLOR: blue">if</span> (
firedWaitHandle == 0 )<br />
                       
{<br />
                           
sourceQueue.EndPeek(asynchResult);<br />
                           
Message receivedMessage = sourceQueue.Receive( TimeSpan.FromSeconds(0), 
<br />
                               
isTransactional?MessageQueueTransactionType.Single:MessageQueueTransactionType.None
);<br />
                           
<br />
                            <span style="COLOR: blue">try<br /></span>                           
{<br />
                               
messageReceived(<span style="COLOR: blue">this</span>,<span style="COLOR: blue">new</span> MessageReceivedEventArgs(receivedMessage));                        
<br />
                           
}<br />
                            <span style="COLOR: blue">finally<br /></span>                            {<br />
                               
receivedMessage.Dispose();<br />
                           
}<br />
                       
}<br />
                        <span style="COLOR: blue">else</span><span style="COLOR: blue">if</span> (
firedWaitHandle == 1 )<br />
                       
{<br />
                            <span style="COLOR: green">//
Pausing. Clean up the asynchronous Peek operation 
<br /></span>                            <span style="COLOR: green">//
(we'll assume that we have time for that) and then go<br /></span>                            <span style="COLOR: green">//
back to the top of the loop where we'll hang on the 
<br /></span>                            <span style="COLOR: green">//
continueInterrupt.<br /></span>                           
sourceQueue.EndPeek(asynchResult);<br />
                       
}<br />
                        <span style="COLOR: blue">else<br /></span>                       
{<br />
                            <span style="COLOR: green">//
stopping. Skip the EndPeek() and exit the thread immediately.<br /></span>                            <span style="COLOR: blue">return</span>;<br />
                       
}<br />
                   
}<br />
                    <span style="COLOR: blue">catch</span>(MessageQueueException
ex)<br />
                   
{<br />
                        <span style="COLOR: blue">if</span> (
ex.MessageQueueErrorCode != MessageQueueErrorCode.IOTimeout  )<br />
                       
{<br />
                            <span style="COLOR: blue">break</span>;<br />
                       
}<br />
                   
}<br />
                    <span style="COLOR: blue">catch</span>(
Exception ex )<br />
                   
{<br />
                        <span style="COLOR: green">//
absorb all other exceptions and surface them from he listener 
<br /></span>                        <span style="COLOR: green">//
using the ProcessingError event.<br /></span>                       
OnProcessingError( <span style="COLOR: blue">new</span> ProcessingErrorEventArgs(ex));<br />
                   
}<br />
               
}<br />
            }<br />
        }<br />
    }<br />
}</span>
                  </p>
                </td>
              </tr>
            </tbody>
          </table>
          <p class="MsoNormal">
 
</p>
        </div>
        <img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=21f5bd19-f334-462c-94f6-af00c82b7614" />
      </body>
      <title>Dealing with Deadlocks and Other Unfortunate Events on the Application Level: Part 4 (Or: A Simple Message Queue Listener)</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,21f5bd19-f334-462c-94f6-af00c82b7614.aspx</guid>
      <link>http://vasters.com/clemensv/2004/12/09/Dealing+With+Deadlocks+And+Other+Unfortunate+Events+On+The+Application+Level+Part+4+Or+A+Simple+Message+Queue+Listener.aspx</link>
      <pubDate>Thu, 09 Dec 2004 21:52:36 GMT</pubDate>
      <description>&lt;div class=Section1&gt;
&lt;p class=MsoNormal&gt;
&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: Tahoma"&gt;&lt;a href="http://staff.newtelligence.net/clemensv/PermaLink.aspx?guid=3a83d7c0-cded-46f7-a6a6-b6450d66fb56"&gt;See
Part 3&lt;/a&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal&gt;
&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: Tahoma"&gt;In &lt;a href="http://staff.newtelligence.net/clemensv/PermaLink.aspx?guid=3a83d7c0-cded-46f7-a6a6-b6450d66fb56"&gt;Part
3&lt;/a&gt;, I illustrated a simple strategy to re-run a &amp;#8220;repeatable&amp;#8221; transaction
using a simple &amp;#8220;while&amp;#8221; loop. A better and more fault resilient way of
handling such cases (we are talking about transactions, after all) is to employ a
transactional resource manager such as MSMQ from which to retrieve the transaction
input. If the transaction fails due to a catastrophic failure (power outage or worse),
an in-memory recovery strategy like the one shown in &amp;#8220;RunTx()&amp;#8221; will not
get us very far. Instead, we will put the transaction input into a transactional queue,
read it from the queue using a specialized message queue listener and equip that listener
with some handling logic that is similar to what is shown in the &amp;#8220;RunTx()&amp;#8221;
example.&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal&gt;
&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: Tahoma"&gt;Before I will show that, however,
I will give you a generic, multi-threaded message queue listener that is not transaction
aware (in the desired way) and which I will specialize in Part 5 (the last part) of
this series. The reasons that I post the message listener logic in two steps are that
(a) you might find a generic listener useful, (b) it is quite a bit of code and I
don&amp;#8217;t want the &amp;#8220;essentials&amp;#8221; of the recovery code to be buried amongst
the basic queue listener framework, and (c) I am simply too lazy today to explain
it all ;-)&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal&gt;
&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: Tahoma"&gt;Using this queue listener is pretty
straightforward and should be rather self-explanatory. To listen, create an instance
of the listener using one of the constructors and supply a &amp;#8220;queueName&amp;#8221;
argument that is compatible with the System.Messaging.MessageQueue class. The queue
must exist. The listener will bubble messages to the MessageReceived delegate (&amp;#8220;unicast
event&amp;#8221;), which you must implement in your class and assign to the listener in
order to get at the messages.&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: Tahoma"&gt; &lt;/span&gt;
&lt;/p&gt;
&lt;table class=MsoNormalTable style="BACKGROUND: #e6e6e6; WIDTH: 100%; BORDER-COLLAPSE: collapse" cellspacing=0 cellpadding=0 width="100%" border=0&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: windowtext 1pt solid; WIDTH: 6.15in; PADDING-TOP: 0in; BORDER-BOTTOM: windowtext 1pt solid" valign=top width=590&gt;
&lt;p class=MsoNormal&gt;
&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Lucida Console'"&gt;MessageQueueListener
queueListener = &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; MessageQueueListener(sourceQueuePath,
4 );&lt;br&gt;
queueListener.MessageReceived = &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; MessageReceivedEventHandler(queueListener
MessageReceived);&lt;br&gt;
queueListener.ProcessingError += &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; ProcessingErrorEventHandler(queueListener
ProcessingError);&lt;br&gt;
queueListener.Start();&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p class=MsoNormal&gt;
&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: Tahoma"&gt;And here are 344 lines of pure
developer joy:&lt;/span&gt;
&lt;/p&gt;
&lt;table class=MsoNormalTable style="BACKGROUND: #e6e6e6; WIDTH: 100%; BORDER-COLLAPSE: collapse" cellspacing=0 cellpadding=0 width="100%" border=0&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: windowtext 1pt solid; WIDTH: 1168.45pt; PADDING-TOP: 0in; BORDER-BOTTOM: windowtext 1pt solid" valign=top width=1558&gt;
&lt;p class=MsoNormal&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Lucida Console'"&gt;using&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Lucida Console'"&gt; System;&lt;br&gt;
&lt;span style="COLOR: blue"&gt;using&lt;/span&gt; System.Collections;&lt;br&gt;
&lt;span style="COLOR: blue"&gt;using&lt;/span&gt; System.Messaging;&lt;br&gt;
&lt;span style="COLOR: blue"&gt;using&lt;/span&gt; System.Threading;&lt;br&gt;
&lt;br&gt;
&lt;span style="COLOR: blue"&gt;namespace&lt;/span&gt; newtelligence.EnterpriseTools.Msmq&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;summary&amp;gt;&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; Event
argument class for the MessageQueueListener.MessageReceived unicast event&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;/summary&amp;gt;&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;class&lt;/span&gt; MessageReceivedEventArgs
: EventArgs&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;private&lt;/span&gt; Message
receivedMessage;&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;summary&amp;gt;&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; Constructor&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;/summary&amp;gt;&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;param
name="receivedMessage"&amp;gt;&lt;/span&gt;&lt;span style="COLOR: green"&gt;A message&lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;/param&amp;gt;&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;public&lt;/span&gt; MessageReceivedEventArgs(
Message receivedMessage )&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;this&lt;/span&gt;.receivedMessage
= receivedMessage; 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;summary&amp;gt;&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; Received
message&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;/summary&amp;gt;&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;public&lt;/span&gt; Message
ReceivedMessage&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="COLOR: blue"&gt;get&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;return&lt;/span&gt; receivedMessage;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;summary&amp;gt;&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; Event
argument class for the MessageQueueListener.ProcessingError event&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;/summary&amp;gt;&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;class&lt;/span&gt; ProcessingErrorEventArgs
: EventArgs&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;summary&amp;gt;&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; 
&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;/summary&amp;gt;&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;private&lt;/span&gt; Exception
exception;&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;summary&amp;gt;&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; Constructor&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;/summary&amp;gt;&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;param
name="exception"&amp;gt;&lt;/span&gt;&lt;span style="COLOR: green"&gt;An exception&lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;/param&amp;gt;&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;public&lt;/span&gt; ProcessingErrorEventArgs(
Exception exception )&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;this&lt;/span&gt;.exception
= exception;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;summary&amp;gt;&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; Intercepted
exception&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;/summary&amp;gt;&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;public&lt;/span&gt; Exception
Exception&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;get&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;return&lt;/span&gt; exception;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;summary&amp;gt;&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; Delegate
for the MessageQueueListener.MessageReceived unicast event&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;/summary&amp;gt;&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;delegate&lt;/span&gt; &lt;span style="COLOR: blue"&gt;void&lt;/span&gt; MessageReceivedEventHandler( &lt;span style="COLOR: blue"&gt;object&lt;/span&gt; sender,
MessageReceivedEventArgs ea );&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;summary&amp;gt;&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; Delegate
for the MessageQueueListener.ProcessingError event&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;/summary&amp;gt;&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;delegate&lt;/span&gt; &lt;span style="COLOR: blue"&gt;void&lt;/span&gt; ProcessingErrorEventHandler( &lt;span style="COLOR: blue"&gt;object&lt;/span&gt; sender,
ProcessingErrorEventArgs ea );&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;summary&amp;gt;&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; This
class implements a multi-threaded message queue listener&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;/summary&amp;gt;&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;class&lt;/span&gt; MessageQueueListener&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;protected&lt;/span&gt; Guid
instanceId = Guid.NewGuid();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;protected&lt;/span&gt; Thread[]
listenerThreads;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;protected&lt;/span&gt; &lt;span style="COLOR: blue"&gt;string&lt;/span&gt; queueName=&lt;span style="COLOR: blue"&gt;null&lt;/span&gt;;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;protected&lt;/span&gt; &lt;span style="COLOR: blue"&gt;int&lt;/span&gt; numThreads=1;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;protected&lt;/span&gt; ThreadPriority
priority=ThreadPriority.Normal;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;protected&lt;/span&gt; ManualResetEvent
continueInterrupt = &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; ManualResetEvent(&lt;span style="COLOR: blue"&gt;true&lt;/span&gt;);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="COLOR: blue"&gt;protected&lt;/span&gt; ManualResetEvent
pauseInterrupt = &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; ManualResetEvent(&lt;span style="COLOR: blue"&gt;false&lt;/span&gt;);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;protected&lt;/span&gt; ManualResetEvent
stopInterrupt = &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; ManualResetEvent(&lt;span style="COLOR: blue"&gt;false&lt;/span&gt;);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;protected&lt;/span&gt; &lt;span style="COLOR: blue"&gt;int&lt;/span&gt; peekTimeout
= 5;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;protected&lt;/span&gt; MessageReceivedEventHandler
messageReceived;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;protected&lt;/span&gt; &lt;span style="COLOR: blue"&gt;int&lt;/span&gt; refCount
= 0;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;summary&amp;gt;&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; Initializes
a new instance of the MessageQueueListener class&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;/summary&amp;gt;&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;param
name="queueName"&amp;gt;&lt;/span&gt;&lt;span style="COLOR: green"&gt;Message name where listener
waits messages&lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;/param&amp;gt;&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;public&lt;/span&gt; MessageQueueListener(&lt;span style="COLOR: blue"&gt;string&lt;/span&gt; queueName)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; queueName = queueName; 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Initialize();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;summary&amp;gt;&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; Initializes
a new instance of the MessageQueueListener class&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;/summary&amp;gt;&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;param
name="queueName"&amp;gt;&lt;/span&gt;&lt;span style="COLOR: green"&gt;Name of the queue to listen
on&lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;/param&amp;gt;&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;param
name="numThreads"&amp;gt;&lt;/span&gt;&lt;span style="COLOR: green"&gt;Number of threads to run the
listener on&lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;/param&amp;gt;&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;public&lt;/span&gt; MessageQueueListener(&lt;span style="COLOR: blue"&gt;string&lt;/span&gt; queueName, &lt;span style="COLOR: blue"&gt;int&lt;/span&gt; numThreads)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; queueName = queueName; 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; numThreads = numThreads;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Initialize();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;summary&amp;gt;&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; Initializes
a new instance of the MessageQueueListener class&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;/summary&amp;gt;&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;param
name="queueName"&amp;gt;&lt;/span&gt;&lt;span style="COLOR: green"&gt;Name of the queue to listen
on&lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;/param&amp;gt;&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;param
name="numThreads"&amp;gt;&lt;/span&gt;&lt;span style="COLOR: green"&gt;Number of threads run the listener
on&lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;/param&amp;gt;&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;param
name="priority"&amp;gt;&lt;/span&gt;&lt;span style="COLOR: green"&gt;Thread priority&lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;/param&amp;gt;&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;public&lt;/span&gt; MessageQueueListener(&lt;span style="COLOR: blue"&gt;string&lt;/span&gt; queueName, &lt;span style="COLOR: blue"&gt;int&lt;/span&gt; numThreads,
ThreadPriority priority)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; queueName = queueName; 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; numThreads = numThreads;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; priority = priority;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Initialize();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;summary&amp;gt;&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; Adds
a reference to the reference counter.&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;/summary&amp;gt;&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style="COLOR: green"&gt;Current
reference count&lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;/returns&amp;gt;&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;int&lt;/span&gt; AddReference()&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;return&lt;/span&gt; ++
refCount;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;summary&amp;gt;&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; Releases
a reference from the reference counter.&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;/summary&amp;gt;&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style="COLOR: green"&gt;Current
reference count&lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;/returns&amp;gt;&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;remarks&amp;gt;&lt;/span&gt;&lt;span style="COLOR: green"&gt;If
the reference counter drops to or below zero, the listener is stopped.&lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;/remarks&amp;gt;&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;int&lt;/span&gt; ReleaseReference()&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;if&lt;/span&gt; (
-- refCount &amp;lt;= 0 )&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
Stop();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;return&lt;/span&gt; refCount;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;summary&amp;gt;&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; Initializes
the MessageQueueListener&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;/summary&amp;gt;&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;protected&lt;/span&gt; &lt;span style="COLOR: blue"&gt;virtual&lt;/span&gt; &lt;span style="COLOR: blue"&gt;void&lt;/span&gt; Initialize()&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; listenerThreads
= &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; Thread[ numThreads];&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;summary&amp;gt;&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; Unicast
event that is raised when a message has been received&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;/summary&amp;gt;&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;public&lt;/span&gt; MessageReceivedEventHandler
MessageReceived&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;get&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;return&lt;/span&gt; messageReceived;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;set&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;if&lt;/span&gt; (
messageReceived == &lt;span style="COLOR: blue"&gt;value&lt;/span&gt;)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;return&lt;/span&gt;;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
messageReceived = &lt;span style="COLOR: blue"&gt;value&lt;/span&gt;;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;summary&amp;gt;&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; Multicast
event that is raised when an exception occurs during processing.&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;/summary&amp;gt;&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;event&lt;/span&gt; ProcessingErrorEventHandler
ProcessingError;&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;summary&amp;gt;&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; Raises
the ProcessingError event&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;/summary&amp;gt;&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;param
name="pea"&amp;gt;&amp;lt;/param&amp;gt;&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;protected&lt;/span&gt; &lt;span style="COLOR: blue"&gt;void&lt;/span&gt; OnProcessingError(
ProcessingErrorEventArgs pea )&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;if&lt;/span&gt; (ProcessingError
!= &lt;span style="COLOR: blue"&gt;null&lt;/span&gt; )&lt;br&gt;
&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
ProcessingError( &lt;span style="COLOR: blue"&gt;this&lt;/span&gt;, pea );&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;summary&amp;gt;&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; Starts
the message queue listener. If the threads are already running,&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; Start()
does nothing.&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;/summary&amp;gt;&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;void&lt;/span&gt; Start()&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;for&lt;/span&gt;(&lt;span style="COLOR: blue"&gt;int&lt;/span&gt; i=0;i&amp;lt;
numThreads;i++)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;if&lt;/span&gt; (
listenerThreads[i] == &lt;span style="COLOR: blue"&gt;null&lt;/span&gt; )&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
Thread thread = &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; Thread(&lt;span style="COLOR: blue"&gt;new&lt;/span&gt; ThreadStart(&lt;span style="COLOR: blue"&gt;this&lt;/span&gt;.ReceiveLoop));&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;thread.Name = String.Format("{0}:{1}:{2}",i, instanceId,GetType().Name);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
thread.IsBackground = &lt;span style="COLOR: blue"&gt;true&lt;/span&gt;;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
thread.Priority = priority;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
listenerThreads[i] = thread;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
thread.Start();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;summary&amp;gt;&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; Set
listener state in stop&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;/summary&amp;gt;&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;void&lt;/span&gt; Stop()&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Resume();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; stopInterrupt.Set();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;for&lt;/span&gt;(&lt;span style="COLOR: blue"&gt;int&lt;/span&gt; i=0;i&amp;lt;
numThreads;i++)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
listenerThreads[i].Join();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
listenerThreads[i] = &lt;span style="COLOR: blue"&gt;null&lt;/span&gt;;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;summary&amp;gt;&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; Set
listener state to "paused". 
&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;/summary&amp;gt;&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;remarks&amp;gt;&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; Setting
the listener ito the "paused" state will not suspend processing&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; immediately.
All messages that are currently being processed will be 
&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; processed,
but no new messages are being dequeued.&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;/remarks&amp;gt;&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;void&lt;/span&gt; Pause()&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; continueInterrupt.Reset();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pauseInterrupt.Set();&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;summary&amp;gt;&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; Set
listener state to "resume". This will resume the listener from&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; the
"paused" state.&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;/summary&amp;gt;&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;void&lt;/span&gt; Resume()&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pauseInterrupt.Reset();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; continueInterrupt.Set();&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;summary&amp;gt;&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; Gets
a value indicating whether the listener is paused.&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;/summary&amp;gt;&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;bool&lt;/span&gt; IsPaused&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;get&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;return&lt;/span&gt; pauseInterrupt.WaitOne(TimeSpan.Zero,&lt;span style="COLOR: blue"&gt;false&lt;/span&gt;);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;summary&amp;gt;&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; Gets
a value indicating whether the listener is paused.&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;/summary&amp;gt;&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;bool&lt;/span&gt; IsStopping&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;get&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;return&lt;/span&gt; stopInterrupt.WaitOne(TimeSpan.Zero,&lt;span style="COLOR: blue"&gt;false&lt;/span&gt;);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;summary&amp;gt;&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; This
is the thread entry point for the main receive loop.&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;/summary&amp;gt;&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;protected&lt;/span&gt; &lt;span style="COLOR: blue"&gt;virtual&lt;/span&gt; &lt;span style="COLOR: blue"&gt;void&lt;/span&gt; ReceiveLoop()&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;using&lt;/span&gt; (MessageQueue
sourceQueue = &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; MessageQueue( queueName, &lt;span style="COLOR: blue"&gt;false&lt;/span&gt; ))&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;bool&lt;/span&gt; isTransactional
= sourceQueue.Transactional;&lt;br&gt;
&lt;font size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
sourceQueue.MessageReadPropertyFilter.SetAll();&lt;br&gt;
&lt;/font&gt;&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Lucida Console'"&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;while&lt;/span&gt; (
!IsStopping )&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: green"&gt;//
if the continue interrupt is not set, we will hang here&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: green"&gt;//
until it is set again (resuming)&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
WaitHandle.WaitAny(&lt;span style="COLOR: blue"&gt;new&lt;/span&gt; WaitHandle[]{ continueInterrupt,
stopInterrupt});&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;try&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: green"&gt;//peek
on the queue and wait for a message becoming available&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
IAsyncResult asynchResult = sourceQueue.BeginPeek(TimeSpan.FromSeconds( peekTimeout),&lt;span style="COLOR: blue"&gt;null&lt;/span&gt;,&lt;span style="COLOR: blue"&gt;null&lt;/span&gt;);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;int&lt;/span&gt; firedWaitHandle
= WaitHandle.WaitAny(&lt;span style="COLOR: blue"&gt;new&lt;/span&gt; WaitHandle[]{asynchResult.AsyncWaitHandle,
pauseInterrupt, stopInterrupt});&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;if&lt;/span&gt; (
firedWaitHandle == 0 )&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
sourceQueue.EndPeek(asynchResult);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
Message receivedMessage = sourceQueue.Receive( TimeSpan.FromSeconds(0), 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
isTransactional?MessageQueueTransactionType.Single:MessageQueueTransactionType.None
);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="COLOR: blue"&gt;try&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
messageReceived(&lt;span style="COLOR: blue"&gt;this&lt;/span&gt;,&lt;span style="COLOR: blue"&gt;new&lt;/span&gt; MessageReceivedEventArgs(receivedMessage));&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;finally&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
receivedMessage.Dispose();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;else&lt;/span&gt; &lt;span style="COLOR: blue"&gt;if&lt;/span&gt; (
firedWaitHandle == 1 )&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: green"&gt;//
Pausing. Clean up the asynchronous Peek operation 
&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: green"&gt;//
(we'll assume that we have time for that) and then go&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: green"&gt;//
back to the top of the loop where we'll hang on the 
&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: green"&gt;//
continueInterrupt.&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
sourceQueue.EndPeek(asynchResult);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;else&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: green"&gt;//
stopping. Skip the EndPeek() and exit the thread immediately.&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="COLOR: blue"&gt;return&lt;/span&gt;;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;catch&lt;/span&gt;(MessageQueueException
ex)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;if&lt;/span&gt; (
ex.MessageQueueErrorCode != MessageQueueErrorCode.IOTimeout&amp;nbsp; )&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;break&lt;/span&gt;;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;catch&lt;/span&gt;(
Exception ex )&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: green"&gt;//
absorb all other exceptions and surface them from he listener 
&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: green"&gt;//
using the ProcessingError event.&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
OnProcessingError( &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; ProcessingErrorEventArgs(ex));&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
}&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p class=MsoNormal&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;/div&gt;
&lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=21f5bd19-f334-462c-94f6-af00c82b7614" /&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,21f5bd19-f334-462c-94f6-af00c82b7614.aspx</comments>
      <category>Technology/MSMQ</category>
    </item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=c48dd120-cf19-42b8-ad14-39ad3ec1c3e4</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,c48dd120-cf19-42b8-ad14-39ad3ec1c3e4.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,c48dd120-cf19-42b8-ad14-39ad3ec1c3e4.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=c48dd120-cf19-42b8-ad14-39ad3ec1c3e4</wfw:commentRss>
      <slash:comments>3</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
The little series I am currently <a href="http://staff.newtelligence.net/clemensv/PermaLink.aspx?guid=3a83d7c0-cded-46f7-a6a6-b6450d66fb56">writing
here</a> on my blog has inspired me to write way too more code than actually necessary
to get my point across ;-) So by now I've got my own MSMQ transport for WSE 2.0
(yes, I know that others have written that already, but I am shooting for
a "enterprise strength" implementation), a WebRequest/WebResponse pair to smuggle
under arbitrary ASMX proxies and I am more than halfway done with a server-side host
for MSMQ-to-ASMX (spelled out: ASP.NET Web Services). 
</p>
        <p>
What bugs me is that WSE 2.0's messaging model is "asynchronous only" and that it <em>always</em> performs
a push/pull translation and that there is no way to push a message through to a service
on the receiving thread. Whenever I grab a message from the queue and put it into
my SoapTransport's "Dispatch()" method, the message gets queued up in an in-memory
queue and that is then, on a concurrent thread, pulled (OnReceiveComplete) by the
SoapReceivers collection and submitted into ProcessMessage() of the SoapReceiver (like
any SoapService derived implementation) matching the target endpoint. So while
I can dequeue from MSMQ within a transaction scope (ServiceDomain), that transaction
scope doesn't make it across onto the thread that will actually execute the action
inside the SoapReceiver/SoapService.
</p>
        <p>
So now I am sitting here, contemplating and trying to figure out a workaround that doesn't
require me to rewrite a big chunk of WSE 2.0 (which I am totally not shy
of if that is what it takes). Transaction marshaling, thread synchronization,
ah, I love puzzles. Once I am know how to solve this and have made the adjustments,
I'll post the queue listener I promised to wrap up the series. The other code I've
written in the process will likely surface in some other way.
</p>
        <img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=c48dd120-cf19-42b8-ad14-39ad3ec1c3e4" />
      </body>
      <title>Push/Pull Translation and Transactions</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,c48dd120-cf19-42b8-ad14-39ad3ec1c3e4.aspx</guid>
      <link>http://vasters.com/clemensv/2004/12/05/PushPull+Translation+And+Transactions.aspx</link>
      <pubDate>Sun, 05 Dec 2004 15:41:21 GMT</pubDate>
      <description>&lt;p&gt;
The little series I am currently &lt;a href="http://staff.newtelligence.net/clemensv/PermaLink.aspx?guid=3a83d7c0-cded-46f7-a6a6-b6450d66fb56"&gt;writing
here&lt;/a&gt; on my blog has inspired me to write way too more code than actually necessary
to get my point across&amp;nbsp;;-) So by now I've got my own MSMQ transport for WSE 2.0
(yes, I know&amp;nbsp;that others have&amp;nbsp;written that already, but I am shooting for
a "enterprise strength" implementation), a WebRequest/WebResponse pair to smuggle
under arbitrary ASMX proxies and I am more than halfway done with&amp;nbsp;a server-side&amp;nbsp;host
for MSMQ-to-ASMX&amp;nbsp;(spelled out: ASP.NET Web Services). 
&lt;/p&gt;
&lt;p&gt;
What bugs me is that WSE 2.0's messaging model is "asynchronous only" and that&amp;nbsp;it &lt;em&gt;always&lt;/em&gt; performs
a push/pull translation and that there is no way to push a message through to a service
on the receiving thread. Whenever I grab a message from the queue and put it into
my SoapTransport's "Dispatch()" method, the message gets queued up in an in-memory
queue and that is then, on a concurrent thread, pulled (OnReceiveComplete) by the
SoapReceivers collection and submitted into&amp;nbsp;ProcessMessage() of the SoapReceiver&amp;nbsp;(like
any SoapService derived implementation) matching the target endpoint.&amp;nbsp;So while
I can dequeue from MSMQ within a transaction scope (ServiceDomain), that transaction
scope doesn't make it across onto the thread that will actually execute the action
inside the SoapReceiver/SoapService.
&lt;/p&gt;
&lt;p&gt;
So now I am sitting here, contemplating and trying to figure out a workaround that&amp;nbsp;doesn't
require me to&amp;nbsp;rewrite a big chunk of WSE 2.0 (which I am&amp;nbsp;totally not shy
of if that is what it takes).&amp;nbsp;Transaction marshaling, thread synchronization,
ah, I love puzzles. Once I am know how to solve this and have made the adjustments,
I'll post the queue listener I promised to wrap up the series. The other code I've
written in the process will likely surface in some other way.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=c48dd120-cf19-42b8-ad14-39ad3ec1c3e4" /&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,c48dd120-cf19-42b8-ad14-39ad3ec1c3e4.aspx</comments>
      <category>Technology</category>
      <category>Technology/Enterprise Services</category>
      <category>Technology/MSMQ</category>
      <category>Technology/Web Services</category>
    </item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=3a83d7c0-cded-46f7-a6a6-b6450d66fb56</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,3a83d7c0-cded-46f7-a6a6-b6450d66fb56.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,3a83d7c0-cded-46f7-a6a6-b6450d66fb56.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=3a83d7c0-cded-46f7-a6a6-b6450d66fb56</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <div class="Section1">
          <p class="MsoNormal">
            <span style="FONT-SIZE: 10pt; FONT-FAMILY: Tahoma">
              <a href="http://staff.newtelligence.net/clemensv/PermaLink.aspx?guid=bafdbe41-0786-4a7f-a488-8ca447d612eb">See
Part 2</a>
            </span>
          </p>
          <p class="MsoNormal">
            <span style="FONT-SIZE: 10pt; FONT-FAMILY: Tahoma">Now that we have a way to detect
deadlocks and similar error conditions we might encounter during a transaction, we
need to find a mechanism that will allow us to back out of the doomed transaction
and retry the failed operation. The good thing about transaction failures of that
sort is that you can essentially retry as often as you want without doing anything
wrong – as long as all the resources you are reading from and writing to are
guarded by transactional resource managers that are enlisted in the transaction. And
that’s the hint at the trick we need to use.</span>
          </p>
          <p class="MsoNormal">
            <span style="FONT-SIZE: 10pt; FONT-FAMILY: Tahoma">If we were executing the code below
through a remote call, it might be rather difficult to recover from a failure. The
local transaction inside the component will roll back – ok – but that
punts the problem back out to the caller, who will have to implement the appropriate
logic to single out transaction failure causes that can be fixed by a retry and to
actually resubmit the request. That can be rather tricky. </span>
          </p>
          <table class="MsoTableGrid" style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #e6e6e6; BORDER-LEFT: medium none; WIDTH: 100%; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" width="100%" border="1">
            <tbody>
              <tr>
                <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: windowtext 1pt solid; PADDING-TOP: 0in; BORDER-BOTTOM: windowtext 1pt solid" valign="top">
                  <p class="MsoNormal">
                    <span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Lucida Console'">[Transaction(TransactionOption.Required)]<br /><span style="COLOR: blue">public</span><span style="COLOR: blue">class</span> DoesStuff
: ServicedComponent<br />
{<br />
    /* things omitted */<br />
 <br />
    [AutoComplete]<br />
    <span style="COLOR: blue">public</span><span style="COLOR: blue">void</span> DoStuff( <span style="COLOR: blue">string</span> argument
)<br />
    {<br />
        <span style="COLOR: blue">try<br /></span>        {<br />
           dbConnection.Open();<br />
           sprocUpdateAndQueryStuff.Parameters["@StuffArgument"].Value
= argument;<br />
           result = <span style="COLOR: blue">this</span>.GetResultFromReader(
sprocUpdateAndQueryStuff.ExecuteReader() );<br />
        }<br />
        <span style="COLOR: blue">catch</span>(
Exception exception )<br />
        {<br />
            <span style="COLOR: blue">throw</span> RepeatableOperationExceptionMapper.MapException(
exception );                            
<br />
        }<br />
        <span style="COLOR: blue">finally<br /></span>        {<br />
            dbConnection.Close();<br />
        }<br />
    }<br />
}</span>
                  </p>
                </td>
              </tr>
            </tbody>
          </table>
          <p class="MsoNormal">
            <span style="FONT-SIZE: 10pt; FONT-FAMILY: Tahoma">Even worse, we might not even learn
about a failure depending on when and why the transaction fails. In distributed transaction
scenarios, it is absolutely possible (even though rare) that a transaction fails long
after the application code is done with all of its processing. Let’s assume
everything in the call to <i>DoStuff()</i> above works just fine. The code calls a
stored procedure on a remote SQL Server, SQL Server is completely happy and so is
the component. Hence, neither has any good reason to complain. Let’s further
assume there is a component <i>DoesOtherStuff</i> just like the one above and that
component is subsequently called by the remote client and updates some other SQL Server
database from within the same distributed transaction. That SQL Server and that component
are both happy as well. Everybody is happy. The client commits the transaction, maybe
by calling ServiceDomain.Leave() or leaving from a method of a ServicedComponent that
serves as the transaction root. Now DTC (the transaction coordinator) wants to go
around and ask everyone for their opinion about the transaction outcome. At this point,
all user code you’ve contributed to this story is done executing. And now (we
are talking about transactions, so this is where the fun is) disaster strikes and
one of the SQL Servers you were talking to suddenly gets cut off from the network
in some way. Hardware issue. Crash. Something. If you are lucky, the problem occurs
while DTC is still walking around asking for votes (Phase 1). In this case, the transaction
will just abort. If you are horribly unlucky, disaster strikes while DTC is already
issuing commit commands (Phase 2). In that case, the transaction may (and will) just
hang forever until either the network connection is restored or some operator throws
in the hammer and resolves the transaction manually (and may deliberately cause inconsistency).
Since all this might happen asynchronously, none of your code might ever end up knowing
that the transaction failed and the (transient) transaction results just end up being
quietly rolled back in the background.</span>
          </p>
          <p class="MsoNormal">
            <span style="FONT-SIZE: 10pt; FONT-FAMILY: Tahoma">Before you get all nervous about
the asynchronous case, let’s look at a strategy to deal with the scenario from
the client side, assuming that the transaction is resolved synchronously. We will
take into account that there are transaction failures that can be fixed by rerunning
the transaction. </span>
          </p>
          <table class="MsoTableGrid" style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #e6e6e6; BORDER-LEFT: medium none; WIDTH: 100%; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" width="100%" border="1">
            <tbody>
              <tr>
                <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: windowtext 1pt solid; PADDING-TOP: 0in; BORDER-BOTTOM: windowtext 1pt solid" valign="top">
                  <p class="MsoNormal">
                    <span style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Lucida Console'">public</span>
                    <span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Lucida Console'">
                      <span style="COLOR: blue">void</span> RunTx(<span style="COLOR: blue">string</span> argument)<br />
{<br />
    TransactionStatus status;<br />
    <span style="COLOR: blue">bool</span> done = <span style="COLOR: blue">false</span>;<br /><br />
    <span style="COLOR: blue">while</span>( !done )<br />
    {<br />
        ServiceConfig cfg = <span style="COLOR: blue">new</span> ServiceConfig();<br />
        cfg.Transaction = TransactionOption.Required;<br />
        ServiceDomain.Enter(cfg);<br /><br />
        <span style="COLOR: blue">try<br /></span>        {<br />
            DoesStuff doesStuff
= <span style="COLOR: blue">new</span> DoesStuff();<br />
            doesStuff.DoStuff(argument);<br /><br />
            ContextUtil.SetComplete();<br />
            done = <span style="COLOR: blue">true</span>;<br />
        }<br />
        <span style="COLOR: blue">catch</span> (RepeatableOperationException
re)<br />
        {<br />
            ContextUtil.SetAbort();<br />
        }<br />
        <span style="COLOR: blue">catch<br /></span>        {<br />
            ContextUtil.SetAbort();<br />
            <span style="COLOR: blue">throw</span>;<br />
        }<br />
        <span style="COLOR: blue">finally<br /></span>        {<br />
            status = ServiceDomain.Leave();<br />
        }<br />
    }<br />
    <span style="COLOR: blue">return</span> status;<br />
}</span>
                  </p>
                </td>
              </tr>
            </tbody>
          </table>
          <p class="MsoNormal">
            <span style="FONT-SIZE: 10pt; FONT-FAMILY: Tahoma">If a component throws an exception
indicating that running the transaction again might yield a success, we’ll catch
that condition, abort the local transaction and since we don’t set <i>done</i> to <i>true</i>,
we will get back to the top of the loop and rerun the transaction. If we find another
exception, we will abort the transaction and re-throw the exception we caught. The
loop might look a bit awkward, but it does the job of re-running the transaction whenever
that’s desired.  So all you need to do is to use that sort of a loop everywhere
in your code and you are all set. Well … almost. </span>
          </p>
          <p class="MsoNormal">
            <span style="FONT-SIZE: 10pt; FONT-FAMILY: Tahoma">Assume that the argument we pass
into <i>RunTx()</i> is something as complex and valuable (!) as a purchase order that
you just got into your system. A purchase order is as good as cash. The longer you
keep that purchase order around in memory, the greater is the risk that your local
process (or machine) will fail catastrophically for some arbitrary reason. So if you
need to re-run the transaction one or two times because the backend system is struggling
(again, this all technology for the worst imaginable case) you are making yourself
increasingly vulnerable to a local failure until the transaction finally succeeds.
To reduce that risk, it therefore makes sense to add another step here. </span>
          </p>
          <p class="MsoNormal">
            <span style="FONT-SIZE: 10pt; FONT-FAMILY: Tahoma">Before we even start the transaction
that does the processing, we grab the input data and guard it using a transactional
resource manager – such as MSMQ. If we throw the input data into a private,
transactional MSMQ queue as the first step and before we do anything else, the data
is safely guarded on disk. If the machine fails once the data is in the queue, the
data – encapsulated in a message – will still be available once the machine
comes back up. Using a message queue listener, the messages in the queue are then
each read from within individual transactions and the data is submitted into the processing
component. Because the messages are simply put back into the queue if the transaction
fails, re-running the transaction is practically automatic once the message queue
listener restarts. Which leaves a problem: There are failing transactions that we
want to repeat and there are failing transactions of which we know that they will
not succeed no matter how often we try them. If a transactional component throws an
exception because it has a bug, the transaction will abort and no number of re-runs
will have that transaction succeed. Messages (data) that cause this sort of behavior
are “poisonous” and we need to sort them out. Stay tuned; the message
queue listener that takes care of all of that is up next.</span>
          </p>
        </div>
        <img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=3a83d7c0-cded-46f7-a6a6-b6450d66fb56" />
      </body>
      <title>Dealing with Deadlocks and Other Unfortunate Events on the Application Level: Part 3</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,3a83d7c0-cded-46f7-a6a6-b6450d66fb56.aspx</guid>
      <link>http://vasters.com/clemensv/2004/12/02/Dealing+With+Deadlocks+And+Other+Unfortunate+Events+On+The+Application+Level+Part+3.aspx</link>
      <pubDate>Thu, 02 Dec 2004 22:22:43 GMT</pubDate>
      <description>&lt;div class=Section1&gt;
&lt;p class=MsoNormal&gt;
&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: Tahoma"&gt;&lt;a href="http://staff.newtelligence.net/clemensv/PermaLink.aspx?guid=bafdbe41-0786-4a7f-a488-8ca447d612eb"&gt;See
Part 2&lt;/a&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal&gt;
&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: Tahoma"&gt;Now that we have a way to detect
deadlocks and similar error conditions we might encounter during a transaction, we
need to find a mechanism that will allow us to back out of the doomed transaction
and retry the failed operation. The good thing about transaction failures of that
sort is that you can essentially retry as often as you want without doing anything
wrong &amp;#8211; as long as all the resources you are reading from and writing to are
guarded by transactional resource managers that are enlisted in the transaction. And
that&amp;#8217;s the hint at the trick we need to use.&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal&gt;
&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: Tahoma"&gt;If we were executing the code below
through a remote call, it might be rather difficult to recover from a failure. The
local transaction inside the component will roll back &amp;#8211; ok &amp;#8211; but that
punts the problem back out to the caller, who will have to implement the appropriate
logic to single out transaction failure causes that can be fixed by a retry and to
actually resubmit the request. That can be rather tricky. &lt;/span&gt;
&lt;/p&gt;
&lt;table class=MsoTableGrid style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #e6e6e6; BORDER-LEFT: medium none; WIDTH: 100%; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing=0 cellpadding=0 width="100%" border=1&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: windowtext 1pt solid; PADDING-TOP: 0in; BORDER-BOTTOM: windowtext 1pt solid" valign=top&gt;
&lt;p class=MsoNormal&gt;
&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Lucida Console'"&gt;[Transaction(TransactionOption.Required)]&lt;br&gt;
&lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;class&lt;/span&gt; DoesStuff
: ServicedComponent&lt;br&gt;
{&lt;br&gt;
&amp;nbsp; &amp;nbsp;&amp;nbsp;/* things omitted */&lt;br&gt;
&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; [AutoComplete]&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;void&lt;/span&gt; DoStuff( &lt;span style="COLOR: blue"&gt;string&lt;/span&gt; argument
)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;try&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dbConnection.Open();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;sprocUpdateAndQueryStuff.Parameters["@StuffArgument"].Value
= argument;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; result = &lt;span style="COLOR: blue"&gt;this&lt;/span&gt;.GetResultFromReader(
sprocUpdateAndQueryStuff.ExecuteReader() );&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;catch&lt;/span&gt;(
Exception exception )&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="COLOR: blue"&gt;throw&lt;/span&gt; RepeatableOperationExceptionMapper.MapException(
exception );&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&lt;br&gt;
&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="COLOR: blue"&gt;finally&lt;br&gt;
&lt;/span&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dbConnection.Close();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
}&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p class=MsoNormal&gt;
&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: Tahoma"&gt;Even worse, we might not even learn
about a failure depending on when and why the transaction fails. In distributed transaction
scenarios, it is absolutely possible (even though rare) that a transaction fails long
after the application code is done with all of its processing. Let&amp;#8217;s assume
everything in the call to &lt;i&gt;DoStuff()&lt;/i&gt; above works just fine. The code calls a
stored procedure on a remote SQL Server, SQL Server is completely happy and so is
the component. Hence, neither has any good reason to complain. Let&amp;#8217;s further
assume there is a component &lt;i&gt;DoesOtherStuff&lt;/i&gt; just like the one above and that
component is subsequently called by the remote client and updates some other SQL Server
database from within the same distributed transaction. That SQL Server and that component
are both happy as well. Everybody is happy. The client commits the transaction, maybe
by calling ServiceDomain.Leave() or leaving from a method of a ServicedComponent that
serves as the transaction root. Now DTC (the transaction coordinator) wants to go
around and ask everyone for their opinion about the transaction outcome. At this point,
all user code you&amp;#8217;ve contributed to this story is done executing. And now (we
are talking about transactions, so this is where the fun is) disaster strikes and
one of the SQL Servers you were talking to suddenly gets cut off from the network
in some way. Hardware issue. Crash. Something. If you are lucky, the problem occurs
while DTC is still walking around asking for votes (Phase 1). In this case, the transaction
will just abort. If you are horribly unlucky, disaster strikes while DTC is already
issuing commit commands (Phase 2). In that case, the transaction may (and will) just
hang forever until either the network connection is restored or some operator throws
in the hammer and resolves the transaction manually (and may deliberately cause inconsistency).
Since all this might happen asynchronously, none of your code might ever end up knowing
that the transaction failed and the (transient) transaction results just end up being
quietly rolled back in the background.&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal&gt;
&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: Tahoma"&gt;Before you get all nervous about
the asynchronous case, let&amp;#8217;s look at a strategy to deal with the scenario from
the client side, assuming that the transaction is resolved synchronously. We will
take into account that there are transaction failures that can be fixed by rerunning
the transaction. &lt;/span&gt;
&lt;/p&gt;
&lt;table class=MsoTableGrid style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #e6e6e6; BORDER-LEFT: medium none; WIDTH: 100%; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing=0 cellpadding=0 width="100%" border=1&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: windowtext 1pt solid; PADDING-TOP: 0in; BORDER-BOTTOM: windowtext 1pt solid" valign=top&gt;
&lt;p class=MsoNormal&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Lucida Console'"&gt;public&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Lucida Console'"&gt; &lt;span style="COLOR: blue"&gt;void&lt;/span&gt; RunTx(&lt;span style="COLOR: blue"&gt;string&lt;/span&gt; argument)&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; TransactionStatus status;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;bool&lt;/span&gt; done = &lt;span style="COLOR: blue"&gt;false&lt;/span&gt;;&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;while&lt;/span&gt;( !done )&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ServiceConfig cfg = &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; ServiceConfig();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cfg.Transaction = TransactionOption.Required;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ServiceDomain.Enter(cfg);&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;try&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DoesStuff doesStuff
= &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; DoesStuff();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; doesStuff.DoStuff(argument);&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ContextUtil.SetComplete();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; done = &lt;span style="COLOR: blue"&gt;true&lt;/span&gt;;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;catch&lt;/span&gt; (RepeatableOperationException
re)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ContextUtil.SetAbort();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;catch&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ContextUtil.SetAbort();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;throw&lt;/span&gt;;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;finally&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; status = ServiceDomain.Leave();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;return&lt;/span&gt; status;&lt;br&gt;
}&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p class=MsoNormal&gt;
&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: Tahoma"&gt;If a component throws an exception
indicating that running the transaction again might yield a success, we&amp;#8217;ll catch
that condition, abort the local transaction and since we don&amp;#8217;t set &lt;i&gt;done&lt;/i&gt; to &lt;i&gt;true&lt;/i&gt;,
we will get back to the top of the loop and rerun the transaction. If we find another
exception, we will abort the transaction and re-throw the exception we caught. The
loop might look a bit awkward, but it does the job of re-running the transaction whenever
that&amp;#8217;s desired. &amp;nbsp;So all you need to do is to use that sort of a loop everywhere
in your code and you are all set. Well &amp;#8230; almost. &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal&gt;
&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: Tahoma"&gt;Assume that the argument we pass
into &lt;i&gt;RunTx()&lt;/i&gt; is something as complex and valuable (!) as a purchase order that
you just got into your system. A purchase order is as good as cash. The longer you
keep that purchase order around in memory, the greater is the risk that your local
process (or machine) will fail catastrophically for some arbitrary reason. So if you
need to re-run the transaction one or two times because the backend system is struggling
(again, this all technology for the worst imaginable case) you are making yourself
increasingly vulnerable to a local failure until the transaction finally succeeds.
To reduce that risk, it therefore makes sense to add another step here. &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal&gt;
&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: Tahoma"&gt;Before we even start the transaction
that does the processing, we grab the input data and guard it using a transactional
resource manager &amp;#8211; such as MSMQ. If we throw the input data into a private,
transactional MSMQ queue as the first step and before we do anything else, the data
is safely guarded on disk. If the machine fails once the data is in the queue, the
data &amp;#8211; encapsulated in a message &amp;#8211; will still be available once the machine
comes back up. Using a message queue listener, the messages in the queue are then
each read from within individual transactions and the data is submitted into the processing
component. Because the messages are simply put back into the queue if the transaction
fails, re-running the transaction is practically automatic once the message queue
listener restarts. Which leaves a problem: There are failing transactions that we
want to repeat and there are failing transactions of which we know that they will
not succeed no matter how often we try them. If a transactional component throws an
exception because it has a bug, the transaction will abort and no number of re-runs
will have that transaction succeed. Messages (data) that cause this sort of behavior
are &amp;#8220;poisonous&amp;#8221; and we need to sort them out. Stay tuned; the message
queue listener that takes care of all of that is up next.&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=3a83d7c0-cded-46f7-a6a6-b6450d66fb56" /&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,3a83d7c0-cded-46f7-a6a6-b6450d66fb56.aspx</comments>
      <category>Technology/MSMQ</category>
    </item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=bafdbe41-0786-4a7f-a488-8ca447d612eb</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,bafdbe41-0786-4a7f-a488-8ca447d612eb.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,bafdbe41-0786-4a7f-a488-8ca447d612eb.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=bafdbe41-0786-4a7f-a488-8ca447d612eb</wfw:commentRss>
      <slash:comments>8</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <div class="Section1">
          <p class="MsoNormal">
            <span style="FONT-SIZE: 10pt; FONT-FAMILY: Tahoma">
              <a href="http://staff.newtelligence.net/clemensv/PermaLink.aspx?guid=826bc7c9-8b0f-4df6-aabe-e6c5377a9446">See
Part 1</a>
            </span>
          </p>
          <p class="MsoNormal">
            <span style="FONT-SIZE: 10pt; FONT-FAMILY: Tahoma">Before we can do anything about
deadlocks or deal with similar troubles, we first need to be able to tell that we
indeed have a deadlock situation. Finding this out is a matter of knowing the respective
error codes that your database gives you and a mechanism to bubble that information
up to some code that will handle the situation. So before we can think about and write
the handling logic for failed/failing but safely repeatable transactions, we need
to build a few little things. The first thing we’ll need is an exception class
that will wrap the original exception indicating the reason for the transaction failure.
The new exception class’s identity will later serve to filter out exceptions
in a “catch” statement and take the appropriate actions.</span>
          </p>
          <table class="MsoTableGrid" style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #e6e6e6; BORDER-LEFT: medium none; WIDTH: 100%; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" width="100%" border="1">
            <tbody>
              <tr>
                <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: windowtext 1pt solid; PADDING-TOP: 0in; BORDER-BOTTOM: windowtext 1pt solid" valign="top">
                  <p class="MsoNormal">
                    <span style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Lucida Console'">using</span>
                    <span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Lucida Console'"> System;<br /><span style="COLOR: blue">using</span> System.Runtime.Serialization;<br /><br /><span style="COLOR: blue">namespace</span> newtelligence.EnterpriseTools.Data<br />
{<br />
   [Serializable]<br />
   <span style="COLOR: blue">public</span><span style="COLOR: blue">class</span> RepeatableOperationException
: Exception<br />
   {<br />
       <span style="COLOR: blue">public</span> RepeatableOperationException():<span style="COLOR: blue">base</span>()<br />
       {<br />
       }<br /><br />
       <span style="COLOR: blue">public</span> RepeatableOperationException(Exception
innerException)<br />
           :<span style="COLOR: blue">base</span>(<span style="COLOR: blue">null</span>,innerException)<br />
       {<br />
       }<br /><br />
       <span style="COLOR: blue">public</span> RepeatableOperationException(<span style="COLOR: blue">string</span> message,
Exception innerException)<br />
           :<span style="COLOR: blue">base</span>(message,innerException)<br />
       {<br />
       }<br /><br />
       <span style="COLOR: blue">public</span> RepeatableOperationException(<span style="COLOR: blue">string</span> message):<span style="COLOR: blue">base</span>(message)<br />
       {<br />
       }<br /><br />
        <span style="COLOR: blue">public</span> RepeatableOperationException(<br />
          SerializationInfo serializationInfo, 
<br />
          StreamingContext streamingContext)<br />
            :<span style="COLOR: blue">base</span>(serializationInfo,streamingContext)<br />
        {<br />
        }<br /><br />
        <span style="COLOR: blue">public</span><span style="COLOR: blue">override</span><span style="COLOR: blue">void</span> GetObjectData(<br />
           System.Runtime.Serialization.SerializationInfo
info,<br />
           System.Runtime.Serialization.StreamingContext
context)<br />
        {<br />
            <span style="COLOR: blue">base</span>.GetObjectData
(info, context);<br />
        }<br />
   }<br />
}</span>
                  </p>
                </td>
              </tr>
            </tbody>
          </table>
          <p class="MsoNormal">
            <span style="FONT-SIZE: 10pt; FONT-FAMILY: Tahoma">Having an exception wrapper with
the desired semantics, we know need to be able to figure out when to replace the original
exception with this wrapper and re-throw it up on the call stack. The idea is that
whenever you execute a database operation – or, more generally, any operation
that might be repeatable on failure – you will catch the resulting exception
and run it through a factory, which will analyze the exception and wrap it with the
RepeatableOperationException if the issue at hand can be resolved by re-running the
transaction. The (still a little naïve) code below illustrates how to such a
factory in the application code. Later we will flesh out the catch block a little
more, since we will lose the original call stack if we end up re-throwing the original
exception like shown here:</span>
          </p>
          <table class="MsoTableGrid" style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #e6e6e6; BORDER-LEFT: medium none; WIDTH: 100%; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" width="100%" border="1">
            <tbody>
              <tr>
                <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: windowtext 1pt solid; PADDING-TOP: 0in; BORDER-BOTTOM: windowtext 1pt solid" valign="top">
                  <p class="MsoNormal">
                    <span style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Lucida Console'">Try<br /></span>
                    <span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Lucida Console'">{<br />
   dbConnection.Open();<br />
   sprocUpdateAndQueryStuff.Parameters["@StuffArgument"].Value = argument;<br />
   result = <span style="COLOR: blue">this</span>.GetResultFromReader( sprocUpdateAndQueryStuff.ExecuteReader()
);<br />
}<br /><span style="COLOR: blue">catch</span>( Exception exception )<br />
{<br /><span style="COLOR: blue">   throw</span> RepeatableOperationExceptionMapper.MapException(
exception );                   
        
<br />
}<br /><span style="COLOR: blue">finally<br /></span>{<br />
   dbConnection.Close();<br />
}</span>
                  </p>
                </td>
              </tr>
            </tbody>
          </table>
          <p class="MsoNormal">
            <span style="FONT-SIZE: 10pt; FONT-FAMILY: Tahoma">The factory class itself is rather
simple in structure, but a bit tricky to put together, because you have to know the
right error codes for all resource managers you will ever run into. In the example
below I put in what I believe to be the appropriate codes for SQL Server and Oracle
(corrections are welcome) and left the ODBC and OLE DB factories (for which would
have to inspect the driver type and the respective driver-specific error codes) blank.
The factory will check out the exception data type and delegate mapping to a private
method that is specialized for a specific managed provider. </span>
          </p>
          <table class="MsoTableGrid" style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #e6e6e6; BORDER-LEFT: medium none; WIDTH: 100%; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" width="100%" border="1">
            <tbody>
              <tr>
                <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: windowtext 1pt solid; PADDING-TOP: 0in; BORDER-BOTTOM: windowtext 1pt solid" valign="top">
                  <p class="MsoNormal">
                    <span style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Lucida Console'">using</span>
                    <span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Lucida Console'"> System;<br /><span style="COLOR: blue">using</span> System.Data.SqlClient;<br /><span style="COLOR: blue">using</span> System.Data.OleDb;<br /><span style="COLOR: blue">using</span> System.Data.Odbc;<br /><span style="COLOR: blue">using</span> System.Data.OracleClient;<br /><br /><span style="COLOR: blue">namespace</span> newtelligence.EnterpriseTools.Data<br />
{<br />
   <span style="COLOR: blue">public</span><span style="COLOR: blue">class</span> RepeatableOperationExceptionMapper<br />
   {<br />
        <span style="COLOR: gray">///</span><span style="COLOR: green"></span><span style="COLOR: gray">&lt;summary&gt;<br /></span>        <span style="COLOR: gray">///</span><span style="COLOR: green"> Maps
the exception to a Repeatable exception, if the error code<br /></span>        <span style="COLOR: gray">///</span><span style="COLOR: green"> indicates
that the transaction is repeatable.<br /></span>        <span style="COLOR: gray">///</span><span style="COLOR: green"></span><span style="COLOR: gray">&lt;/summary&gt;<br /></span>        <span style="COLOR: gray">///</span><span style="COLOR: green"></span><span style="COLOR: gray">&lt;param
name="sqlException"&gt;&lt;/param&gt;<br /></span>        <span style="COLOR: gray">///</span><span style="COLOR: green"></span><span style="COLOR: gray">&lt;returns&gt;&lt;/returns&gt;<br /></span>        <span style="COLOR: blue">private</span><span style="COLOR: blue">static</span> Exception
MapSqlException( SqlException sqlException )<br />
        {<br />
            <span style="COLOR: blue">switch</span> (
sqlException.Number )<br />
            {<br />
                <span style="COLOR: blue">case</span> -2: <span style="COLOR: green">/*
Client Timeout */</span><br />
                <span style="COLOR: blue">case</span> 701: <span style="COLOR: green">/*
Out of Memory */</span><br />
                <span style="COLOR: blue">case</span> 1204: <span style="COLOR: green">/*
Lock Issue */</span><br />
                <span style="COLOR: blue">case</span> 1205: <span style="COLOR: green">/*
Deadlock Victim */</span><br />
                <span style="COLOR: blue">case</span> 1222: <span style="COLOR: green">/*
Lock Request Timeout */</span><br />
                <span style="COLOR: blue">case</span> 8645: <span style="COLOR: green">/*
Timeout waiting for memory resource */</span><br />
                <span style="COLOR: blue">case</span> 8651: <span style="COLOR: green">/*
Low memory condition */</span><br />
                    <span style="COLOR: blue">return</span><span style="COLOR: blue">new</span> RepeatableOperationException(sqlException);<br />
                <span style="COLOR: blue">default</span>:<br />
                    <span style="COLOR: blue">return</span> sqlException;<br />
            }<br />
        }<br /><br />
        <span style="COLOR: blue">private</span><span style="COLOR: blue">static</span> Exception
MapOleDbException( OleDbException oledbException )<br />
        {<br />
            <span style="COLOR: blue">switch</span> (
oledbException.ErrorCode )<br />
            {<br />
                <span style="COLOR: blue">default</span>:<br />
                    <span style="COLOR: blue">return</span> oledbException;<br />
            }<br />
        }<br /><br />
        <span style="COLOR: blue">private</span><span style="COLOR: blue">static</span> Exception
MapOdbcException( OdbcException odbcException )<br />
        {<br />
            <span style="COLOR: blue">return</span> odbcException;            
<br />
        }<br /><br />
        <span style="COLOR: blue">private</span><span style="COLOR: blue">static</span> Exception
MapOracleException( OracleException oracleException )<br />
        {<br />
            <span style="COLOR: blue">switch</span> (
oracleException.Code )<br />
            {<br />
                <span style="COLOR: blue">case</span> 104:  <span style="COLOR: green">/*
ORA-00104: Deadlock detected; all public servers blocked waiting for resources */<br /></span>                <span style="COLOR: blue">case</span> 1013: <span style="COLOR: green">/*
ORA-01013: User requested cancel of current operation */<br /></span>                <span style="COLOR: blue">case</span> 2087: <span style="COLOR: green">/*
ORA-02087: Object locked by another process in same transaction */<br /></span>                <span style="COLOR: blue">case</span> 60:   <span style="COLOR: green">/*
ORA-00060: Deadlock detected while waiting for resource */</span><br />
              
     <span style="COLOR: blue">return</span><span style="COLOR: blue">new</span> RepeatableOperationException(
oracleException );<br />
                <span style="COLOR: blue">default</span>:<br />
                    <span style="COLOR: blue">return</span> oracleException;<br />
            }<br />
        }<br /><br />
        <span style="COLOR: blue">public</span><span style="COLOR: blue">static</span> Exception
MapException( Exception exception )<br />
        {<br />
            <span style="COLOR: blue">if</span> (
exception <span style="COLOR: blue">is</span> SqlException )<br />
            {<br />
                <span style="COLOR: blue">return</span> MapSqlException(
exception <span style="COLOR: blue">as</span> SqlException );<br />
            }<br />
            <span style="COLOR: blue">else</span><span style="COLOR: blue">if</span> (
exception <span style="COLOR: blue">is</span> OleDbException )<br />
            {<br />
                <span style="COLOR: blue">return</span> MapOleDbException(
exception <span style="COLOR: blue">as</span> OleDbException );<br />
            }<br />
            <span style="COLOR: blue">else</span><span style="COLOR: blue">if</span> (exception <span style="COLOR: blue">is</span> OdbcException
)<br />
            {<br />
                <span style="COLOR: blue">return</span> MapOdbcException(
exception <span style="COLOR: blue">as</span> OdbcException );<br />
            }<br />
            <span style="COLOR: blue">else</span><span style="COLOR: blue">if</span> (exception <span style="COLOR: blue">is</span> OracleException
)<br />
            {<br />
                <span style="COLOR: blue">return</span> MapOracleException(
exception <span style="COLOR: blue">as</span> OracleException );<br />
            }<br />
            <span style="COLOR: blue">else</span><br />
            {<br />
                <span style="COLOR: blue">return</span> exception;<br />
            }<br />
        }<br />
   }<br />
}<br /><br /></span>
                  </p>
                </td>
              </tr>
            </tbody>
          </table>
          <p class="MsoNormal">
            <span style="FONT-SIZE: 10pt; FONT-FAMILY: Tahoma">With that little framework of two
classes, we can now selectively throw exceptions that convey whether a failed/failing
transaction is worth repeating. Next step: How do we do actually run such repeats
and make sure we neither lose data nor make the user unhappy in the process? Stay
tuned.</span>
          </p>
        </div>
        <img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=bafdbe41-0786-4a7f-a488-8ca447d612eb" />
      </body>
      <title>Dealing with Deadlocks and Other Unfortunate Events on the Application Level: Part 2</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,bafdbe41-0786-4a7f-a488-8ca447d612eb.aspx</guid>
      <link>http://vasters.com/clemensv/2004/11/30/Dealing+With+Deadlocks+And+Other+Unfortunate+Events+On+The+Application+Level+Part+2.aspx</link>
      <pubDate>Tue, 30 Nov 2004 11:02:27 GMT</pubDate>
      <description>&lt;div class=Section1&gt;
&lt;p class=MsoNormal&gt;
&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: Tahoma"&gt;&lt;a href="http://staff.newtelligence.net/clemensv/PermaLink.aspx?guid=826bc7c9-8b0f-4df6-aabe-e6c5377a9446"&gt;See
Part 1&lt;/a&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal&gt;
&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: Tahoma"&gt;Before we can do anything about
deadlocks or deal with similar troubles, we first need to be able to tell that we
indeed have a deadlock situation. Finding this out is a matter of knowing the respective
error codes that your database gives you and a mechanism to bubble that information
up to some code that will handle the situation. So before we can think about and write
the handling logic for failed/failing but safely repeatable transactions, we need
to build a few little things. The first thing we&amp;#8217;ll need is an exception class
that will wrap the original exception indicating the reason for the transaction failure.
The new exception class&amp;#8217;s identity will later serve to filter out exceptions
in a &amp;#8220;catch&amp;#8221; statement and take the appropriate actions.&lt;/span&gt;
&lt;/p&gt;
&lt;table class=MsoTableGrid style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #e6e6e6; BORDER-LEFT: medium none; WIDTH: 100%; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing=0 cellpadding=0 width="100%" border=1&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: windowtext 1pt solid; PADDING-TOP: 0in; BORDER-BOTTOM: windowtext 1pt solid" valign=top&gt;
&lt;p class=MsoNormal&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Lucida Console'"&gt;using&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Lucida Console'"&gt; System;&lt;br&gt;
&lt;span style="COLOR: blue"&gt;using&lt;/span&gt; System.Runtime.Serialization;&lt;br&gt;
&lt;br&gt;
&lt;span style="COLOR: blue"&gt;namespace&lt;/span&gt; newtelligence.EnterpriseTools.Data&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp; [Serializable]&lt;br&gt;
&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;class&lt;/span&gt; RepeatableOperationException
: Exception&lt;br&gt;
&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;public&lt;/span&gt; RepeatableOperationException():&lt;span style="COLOR: blue"&gt;base&lt;/span&gt;()&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;public&lt;/span&gt; RepeatableOperationException(Exception
innerException)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;:&lt;span style="COLOR: blue"&gt;base&lt;/span&gt;(&lt;span style="COLOR: blue"&gt;null&lt;/span&gt;,innerException)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style="COLOR: blue"&gt;public&lt;/span&gt; RepeatableOperationException(&lt;span style="COLOR: blue"&gt;string&lt;/span&gt; message,
Exception innerException)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&lt;span style="COLOR: blue"&gt;base&lt;/span&gt;(message,innerException)&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;public&lt;/span&gt; RepeatableOperationException(&lt;span style="COLOR: blue"&gt;string&lt;/span&gt; message):&lt;span style="COLOR: blue"&gt;base&lt;/span&gt;(message)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;public&lt;/span&gt; RepeatableOperationException(&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SerializationInfo serializationInfo, 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; StreamingContext streamingContext)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :&lt;span style="COLOR: blue"&gt;base&lt;/span&gt;(serializationInfo,streamingContext)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;override&lt;/span&gt; &lt;span style="COLOR: blue"&gt;void&lt;/span&gt; GetObjectData(&lt;br&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.Runtime.Serialization.SerializationInfo
info,&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.Runtime.Serialization.StreamingContext
context)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;base&lt;/span&gt;.GetObjectData
(info, context);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&amp;nbsp;&amp;nbsp; }&lt;br&gt;
}&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p class=MsoNormal&gt;
&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: Tahoma"&gt;Having an exception wrapper with
the desired semantics, we know need to be able to figure out when to replace the original
exception with this wrapper and re-throw it up on the call stack. The idea is that
whenever you execute a database operation &amp;#8211; or, more generally, any operation
that might be repeatable on failure &amp;#8211; you will catch the resulting exception
and run it through a factory, which will analyze the exception and wrap it with the
RepeatableOperationException if the issue at hand can be resolved by re-running the
transaction. The (still a little na&amp;#239;ve) code below illustrates how to such a
factory in the application code. Later we will flesh out the catch block a little
more, since we will lose the original call stack if we end up re-throwing the original
exception like shown here:&lt;/span&gt;
&lt;/p&gt;
&lt;table class=MsoTableGrid style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #e6e6e6; BORDER-LEFT: medium none; WIDTH: 100%; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing=0 cellpadding=0 width="100%" border=1&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: windowtext 1pt solid; PADDING-TOP: 0in; BORDER-BOTTOM: windowtext 1pt solid" valign=top&gt;
&lt;p class=MsoNormal&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Lucida Console'"&gt;Try&lt;br&gt;
&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Lucida Console'"&gt;{&lt;br&gt;
&amp;nbsp;&amp;nbsp; dbConnection.Open();&lt;br&gt;
&amp;nbsp; &amp;nbsp;sprocUpdateAndQueryStuff.Parameters["@StuffArgument"].Value = argument;&lt;br&gt;
&amp;nbsp;&amp;nbsp; result = &lt;span style="COLOR: blue"&gt;this&lt;/span&gt;.GetResultFromReader( sprocUpdateAndQueryStuff.ExecuteReader()
);&lt;br&gt;
}&lt;br&gt;
&lt;span style="COLOR: blue"&gt;catch&lt;/span&gt;( Exception exception )&lt;br&gt;
{&lt;br&gt;
&lt;span style="COLOR: blue"&gt;&amp;nbsp;&amp;nbsp; throw&lt;/span&gt; RepeatableOperationExceptionMapper.MapException(
exception );&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; 
&lt;br&gt;
}&lt;br&gt;
&lt;span style="COLOR: blue"&gt;finally&lt;br&gt;
&lt;/span&gt;{&lt;br&gt;
&amp;nbsp; &amp;nbsp;dbConnection.Close();&lt;br&gt;
}&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p class=MsoNormal&gt;
&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: Tahoma"&gt;The factory class itself is rather
simple in structure, but a bit tricky to put together, because you have to know the
right error codes for all resource managers you will ever run into. In the example
below I put in what I believe to be the appropriate codes for SQL Server and Oracle
(corrections are welcome) and left the ODBC and OLE DB factories (for which would
have to inspect the driver type and the respective driver-specific error codes) blank.
The factory will check out the exception data type and delegate mapping to a private
method that is specialized for a specific managed provider. &lt;/span&gt;
&lt;/p&gt;
&lt;table class=MsoTableGrid style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #e6e6e6; BORDER-LEFT: medium none; WIDTH: 100%; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing=0 cellpadding=0 width="100%" border=1&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: windowtext 1pt solid; PADDING-TOP: 0in; BORDER-BOTTOM: windowtext 1pt solid" valign=top&gt;
&lt;p class=MsoNormal&gt;
&lt;span style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Lucida Console'"&gt;using&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Lucida Console'"&gt; System;&lt;br&gt;
&lt;span style="COLOR: blue"&gt;using&lt;/span&gt; System.Data.SqlClient;&lt;br&gt;
&lt;span style="COLOR: blue"&gt;using&lt;/span&gt; System.Data.OleDb;&lt;br&gt;
&lt;span style="COLOR: blue"&gt;using&lt;/span&gt; System.Data.Odbc;&lt;br&gt;
&lt;span style="COLOR: blue"&gt;using&lt;/span&gt; System.Data.OracleClient;&lt;br&gt;
&lt;br&gt;
&lt;span style="COLOR: blue"&gt;namespace&lt;/span&gt; newtelligence.EnterpriseTools.Data&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;class&lt;/span&gt; RepeatableOperationExceptionMapper&lt;br&gt;
&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;summary&amp;gt;&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; Maps
the exception to a Repeatable exception, if the error code&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; indicates
that the transaction is repeatable.&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;/summary&amp;gt;&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;param
name="sqlException"&amp;gt;&amp;lt;/param&amp;gt;&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;private&lt;/span&gt; &lt;span style="COLOR: blue"&gt;static&lt;/span&gt; Exception
MapSqlException( SqlException sqlException )&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;switch&lt;/span&gt; (
sqlException.Number )&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;case&lt;/span&gt; -2: &lt;span style="COLOR: green"&gt;/*
Client Timeout */&lt;/span&gt; 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;case&lt;/span&gt; 701: &lt;span style="COLOR: green"&gt;/*
Out of Memory */&lt;/span&gt; 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;case&lt;/span&gt; 1204: &lt;span style="COLOR: green"&gt;/*
Lock Issue */&lt;/span&gt; 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;case&lt;/span&gt; 1205: &lt;span style="COLOR: green"&gt;/*
Deadlock Victim */&lt;/span&gt; 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;case&lt;/span&gt; 1222: &lt;span style="COLOR: green"&gt;/*
Lock Request Timeout */&lt;/span&gt; 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;case&lt;/span&gt; 8645: &lt;span style="COLOR: green"&gt;/*
Timeout waiting for memory resource */&lt;/span&gt; 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;case&lt;/span&gt; 8651: &lt;span style="COLOR: green"&gt;/*
Low memory condition */&lt;/span&gt; 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;return&lt;/span&gt; &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; RepeatableOperationException(sqlException);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;default&lt;/span&gt;:&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;return&lt;/span&gt; sqlException;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;private&lt;/span&gt; &lt;span style="COLOR: blue"&gt;static&lt;/span&gt; Exception
MapOleDbException( OleDbException oledbException )&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;switch&lt;/span&gt; (
oledbException.ErrorCode )&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="COLOR: blue"&gt;default&lt;/span&gt;:&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;return&lt;/span&gt; oledbException;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;private&lt;/span&gt; &lt;span style="COLOR: blue"&gt;static&lt;/span&gt; Exception
MapOdbcException( OdbcException odbcException )&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;return&lt;/span&gt; odbcException;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;private&lt;/span&gt; &lt;span style="COLOR: blue"&gt;static&lt;/span&gt; Exception
MapOracleException( OracleException oracleException )&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;switch&lt;/span&gt; (
oracleException.Code )&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;case&lt;/span&gt; 104:&amp;nbsp; &lt;span style="COLOR: green"&gt;/*
ORA-00104: Deadlock detected; all public servers blocked waiting for resources */&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;case&lt;/span&gt; 1013: &lt;span style="COLOR: green"&gt;/*
ORA-01013: User requested cancel of current operation */&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;case&lt;/span&gt; 2087: &lt;span style="COLOR: green"&gt;/*
ORA-02087: Object locked by another process in same transaction */&lt;br&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;case&lt;/span&gt; 60:&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: green"&gt;/*
ORA-00060: Deadlock detected while waiting for resource */&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="COLOR: blue"&gt;return&lt;/span&gt; &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; RepeatableOperationException(
oracleException );&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;default&lt;/span&gt;:&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;return&lt;/span&gt; oracleException;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;static&lt;/span&gt; Exception
MapException( Exception exception )&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;if&lt;/span&gt; (
exception &lt;span style="COLOR: blue"&gt;is&lt;/span&gt; SqlException )&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;return&lt;/span&gt; MapSqlException(
exception &lt;span style="COLOR: blue"&gt;as&lt;/span&gt; SqlException );&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;else&lt;/span&gt; &lt;span style="COLOR: blue"&gt;if&lt;/span&gt; (
exception &lt;span style="COLOR: blue"&gt;is&lt;/span&gt; OleDbException )&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;return&lt;/span&gt; MapOleDbException(
exception &lt;span style="COLOR: blue"&gt;as&lt;/span&gt; OleDbException );&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;else&lt;/span&gt; &lt;span style="COLOR: blue"&gt;if&lt;/span&gt; (exception &lt;span style="COLOR: blue"&gt;is&lt;/span&gt; OdbcException
)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;return&lt;/span&gt; MapOdbcException(
exception &lt;span style="COLOR: blue"&gt;as&lt;/span&gt; OdbcException );&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;else&lt;/span&gt; &lt;span style="COLOR: blue"&gt;if&lt;/span&gt; (exception &lt;span style="COLOR: blue"&gt;is&lt;/span&gt; OracleException
)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;return&lt;/span&gt; MapOracleException(
exception &lt;span style="COLOR: blue"&gt;as&lt;/span&gt; OracleException );&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;else&lt;/span&gt; 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;return&lt;/span&gt; exception;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&amp;nbsp;&amp;nbsp; }&lt;br&gt;
}&lt;br&gt;
&lt;br&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p class=MsoNormal&gt;
&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: Tahoma"&gt;With that little framework of two
classes, we can now selectively throw exceptions that convey whether a failed/failing
transaction is worth repeating. Next step: How do we do actually run such repeats
and make sure we neither lose data nor make the user unhappy in the process? Stay
tuned.&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=bafdbe41-0786-4a7f-a488-8ca447d612eb" /&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,bafdbe41-0786-4a7f-a488-8ca447d612eb.aspx</comments>
      <category>Architecture</category>
      <category>Architecture/SOA</category>
      <category>Technology/Enterprise Services</category>
      <category>Technology/MSMQ</category>
    </item>
    <item>
      <trackback:ping>http://vasters.com/clemensv/Trackback.aspx?guid=826bc7c9-8b0f-4df6-aabe-e6c5377a9446</trackback:ping>
      <pingback:server>http://vasters.com/clemensv/pingback.aspx</pingback:server>
      <pingback:target>http://vasters.com/clemensv/PermaLink,guid,826bc7c9-8b0f-4df6-aabe-e6c5377a9446.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://vasters.com/clemensv/CommentView,guid,826bc7c9-8b0f-4df6-aabe-e6c5377a9446.aspx</wfw:comment>
      <wfw:commentRss>http://vasters.com/clemensv/SyndicationService.asmx/GetEntryCommentsRss?guid=826bc7c9-8b0f-4df6-aabe-e6c5377a9446</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <div class="Section1">
          <p class="MsoNormal">
            <span style="FONT-SIZE: 10pt; FONT-FAMILY: Tahoma">Deadlocks and other locking conflicts
that cause transactional database operations to fail are things that puzzle many application
developers. Sure, proper database design and careful implementation of database access
(and appropriate support by the database engine) <i>should</i> take care of that problem,
but it cannot do so in all cases. Sometimes, especially under stress and other situations
with high lock contention, a database just has not much of a choice but picking at
least one of the transactions competing for the same locks as the victim in resolving
the deadlock situation and then aborts the chosen transaction. Generally speaking,
transactions that abort and roll back are a good thing, because this behavior guarantees
data integrity. In the end, we use transaction technology for those cases where data
integrity is at risk. What’s interesting is that even though transactions are
a technology that is explicitly about things going wrong, the strategy for dealing
with failing transaction is often not much more than to bubble the problem up to the
user and say “We apologize for the inconvenience. Please press OK”.</span>
          </p>
          <p class="MsoNormal">
            <span style="FONT-SIZE: 10pt; FONT-FAMILY: Tahoma">The appropriate strategy for handling
a deadlock or some other recoverable reason for a transaction abort on the application
level is to back out of the entire operation and to retry the transaction. Retrying
is a gamble that the next time the transaction runs, it won’t run into the same
deadlock situation again or that it will at least come out victorious when the database
picks its victims. Eventually, it’ll work. Even if it takes a few attempts.
That’s the idea. It’s quite simple.</span>
          </p>
          <p class="MsoNormal">
            <span style="FONT-SIZE: 10pt; FONT-FAMILY: Tahoma">What is not really all that simple
is the implementation. Whenever you are using transactions, you must make your code
aware that such “good errors” may occur at any time. Wrapping your transactional
ODBC/OLEDB/ADO/ADO.NET code or calls to transactional Enterprise Services or COM+
components with a try/catch block, writing errors to log-files and showing message
boxes to users just isn’t the right thing to do. The right thing is to simply
do the same batch of work again and until it succeeds.</span>
          </p>
          <p class="MsoNormal">
            <span style="FONT-SIZE: 10pt; FONT-FAMILY: Tahoma">The problem that some developers
seem to have with “just retry” is that it’s not so clear what should
be retried. It’s a problem of finding and defining the proper transaction scope.
Especially when user interaction is in the picture, things easily get very confusing.
If a user has filled in a form on a web page or some dialog window and all of his/her
input is complete and correct, should the user be bothered with a message that the
update transaction failed due to a locking issue? Certainly not. Should the user know
when the transaction fails because the database is currently unavailable? Maybe, but
not necessarily. Should the user be made aware that the application he/she is using
is for some sudden reason incompatible with the database schema of the backend database?
Maybe, but what does Joe in the sales department do with that valuable piece of information?</span>
          </p>
          <p class="MsoNormal">
            <span style="FONT-SIZE: 10pt; FONT-FAMILY: Tahoma">If stuff fails, should we just
forget about Joe’s input and tell him to come back when the system is happier
to serve him? So, in other words, do we have Joe retry the job? That’s easy
to program, but that sort of strategy doesn’t really make Joe happy, does it? </span>
          </p>
          <p class="MsoNormal">
            <span style="FONT-SIZE: 10pt; FONT-FAMILY: Tahoma">So what’s the right thing
to do? One part of the solution is a proper separation between the things the user
(or a program) does and the things that the transaction does. This will give us two
layers and “a job” that can be handed down from the presentation layer
down to the “transaction layer”. Once this separation is in place, we
can come up with a mechanism that will run those jobs in transactions and will automate
how and when transactions are to be retried. Transactional MSMQ queues turn out to
be a brilliant tool to make this very easy to implement. More tomorrow. Stay tuned.</span>
          </p>
        </div>
        <img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=826bc7c9-8b0f-4df6-aabe-e6c5377a9446" />
      </body>
      <title>Dealing with Deadlocks and Other Unfortunate Events on the Application Level: Part 1</title>
      <guid isPermaLink="false">http://vasters.com/clemensv/PermaLink,guid,826bc7c9-8b0f-4df6-aabe-e6c5377a9446.aspx</guid>
      <link>http://vasters.com/clemensv/2004/11/29/Dealing+With+Deadlocks+And+Other+Unfortunate+Events+On+The+Application+Level+Part+1.aspx</link>
      <pubDate>Mon, 29 Nov 2004 23:26:11 GMT</pubDate>
      <description>&lt;div class=Section1&gt;
&lt;p class=MsoNormal&gt;
&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: Tahoma"&gt;Deadlocks and other locking conflicts
that cause transactional database operations to fail are things that puzzle many application
developers. Sure, proper database design and careful implementation of database access
(and appropriate support by the database engine) &lt;i&gt;should&lt;/i&gt; take care of that problem,
but it cannot do so in all cases. Sometimes, especially under stress and other situations
with high lock contention, a database just has not much of a choice but picking at
least one of the transactions competing for the same locks as the victim in resolving
the deadlock situation and then aborts the chosen transaction. Generally speaking,
transactions that abort and roll back are a good thing, because this behavior guarantees
data integrity. In the end, we use transaction technology for those cases where data
integrity is at risk. What&amp;#8217;s interesting is that even though transactions are
a technology that is explicitly about things going wrong, the strategy for dealing
with failing transaction is often not much more than to bubble the problem up to the
user and say &amp;#8220;We apologize for the inconvenience. Please press OK&amp;#8221;.&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal&gt;
&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: Tahoma"&gt;The appropriate strategy for handling
a deadlock or some other recoverable reason for a transaction abort on the application
level is to back out of the entire operation and to retry the transaction. Retrying
is a gamble that the next time the transaction runs, it won&amp;#8217;t run into the same
deadlock situation again or that it will at least come out victorious when the database
picks its victims. Eventually, it&amp;#8217;ll work. Even if it takes a few attempts.
That&amp;#8217;s the idea. It&amp;#8217;s quite simple.&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal&gt;
&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: Tahoma"&gt;What is not really all that simple
is the implementation. Whenever you are using transactions, you must make your code
aware that such &amp;#8220;good errors&amp;#8221; may occur at any time. Wrapping your transactional
ODBC/OLEDB/ADO/ADO.NET code or calls to transactional Enterprise Services or COM+
components with a try/catch block, writing errors to log-files and showing message
boxes to users just isn&amp;#8217;t the right thing to do. The right thing is to simply
do the same batch of work again and until it succeeds.&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal&gt;
&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: Tahoma"&gt;The problem that some developers
seem to have with &amp;#8220;just retry&amp;#8221; is that it&amp;#8217;s not so clear what should
be retried. It&amp;#8217;s a problem of finding and defining the proper transaction scope.
Especially when user interaction is in the picture, things easily get very confusing.
If a user has filled in a form on a web page or some dialog window and all of his/her
input is complete and correct, should the user be bothered with a message that the
update transaction failed due to a locking issue? Certainly not. Should the user know
when the transaction fails because the database is currently unavailable? Maybe, but
not necessarily. Should the user be made aware that the application he/she is using
is for some sudden reason incompatible with the database schema of the backend database?
Maybe, but what does Joe in the sales department do with that valuable piece of information?&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal&gt;
&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: Tahoma"&gt;If stuff fails, should we just
forget about Joe&amp;#8217;s input and tell him to come back when the system is happier
to serve him? So, in other words, do we have Joe retry the job? That&amp;#8217;s easy
to program, but that sort of strategy doesn&amp;#8217;t really make Joe happy, does it? &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal&gt;
&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: Tahoma"&gt;So what&amp;#8217;s the right thing
to do? One part of the solution is a proper separation between the things the user
(or a program) does and the things that the transaction does. This will give us two
layers and &amp;#8220;a job&amp;#8221; that can be handed down from the presentation layer
down to the &amp;#8220;transaction layer&amp;#8221;. Once this separation is in place, we
can come up with a mechanism that will run those jobs in transactions and will automate
how and when transactions are to be retried. Transactional MSMQ queues turn out to
be a brilliant tool to make this very easy to implement. More tomorrow. Stay tuned.&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;img width="0" height="0" src="http://vasters.com/clemensv/aggbug.ashx?id=826bc7c9-8b0f-4df6-aabe-e6c5377a9446" /&gt;</description>
      <comments>http://vasters.com/clemensv/CommentView,guid,826bc7c9-8b0f-4df6-aabe-e6c5377a9446.aspx</comments>
      <category>Architecture</category>
      <category>Architecture/SOA</category>
      <category>Technology/Enterprise Services</category>
      <category>Technology/MSMQ</category>
    </item>
  </channel>
</rss>