<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
  version="2.0">
  <channel>
    <title>Paolo Salvatori's Blog</title>
    <atom:link
      href="https://docs.microsoft.com/archive/blogs/paolos/feed.xml"
      rel="self"
      type="application/rss+xml" />
    <link>https://docs.microsoft.com/archive/blogs/paolos/feed.xml</link>
    <description>Adventures in the magic world of Microsoft Azure</description>
    <lastBuildDate>Thu, 10 Mar 2016 16:52:29 GMT</lastBuildDate>
    <language>en-US</language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>How to normalize incoming events in a Stream Analytics job</title>
      <link>https://docs.microsoft.com/archive/blogs/paolos/how-to-normalize-incoming-events-in-a-stream-analytics-job</link>
      <pubDate>Thu, 21 Jan 2016 07:20:46 GMT</pubDate>
      <dc:creator><![CDATA[Paolo Salvatori]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/paolos/2016/01/21/how-to-normalize-incoming-events-in-a-stream-analytics-job/</guid>
      <description><![CDATA[If you want to normalize the incoming events in a Stream Analytics job and transform records with...]]></description>
      <content:encoded><![CDATA[<p>If you want to normalize the incoming events in a Stream Analytics job and transform records with the following format:</p>  <table cellspacing="1" cellpadding="1" border="0"><tbody>     <tr style="height: 25px; text-align: center; color: rgb(255, 255, 255); vertical-align: middle; background-color: rgb(80, 80, 80);">       <th width="196">Time</th>        <th width="35">Id</th>        <th width="120">P1</th>        <th width="120">P2</th>        <th width="120">P3</th>     </tr>      <tr style="height: 25px; text-align: center; vertical-align: middle;">       <td width="196">2015-12-16T10:00:01.0000000Z</td>        <td width="35">01</td>        <td width="120">15</td>        <td width="120">30</td>        <td width="120">10</td>     </tr>      <tr style="height: 25px; text-align: center; vertical-align: middle;">       <td width="196">2015-12-16T10:00:01.0000000Z</td>        <td width="35">02</td>        <td width="120">25</td>        <td width="120">40</td>        <td width="120">20</td>     </tr>      <tr style="height: 25px; text-align: center; vertical-align: middle;">       <td width="196">2015-12-16T10:00:01.0000000Z</td>        <td width="35">03</td>        <td width="120">45</td>        <td width="120">18</td>        <td width="120">5</td>     </tr>      <tr style="height: 25px; text-align: center; vertical-align: middle;">       <td width="196">2015-12-16T10:00:01.0000000Z</td>        <td width="35">04</td>        <td width="120">20</td>        <td width="120">23</td>        <td width="120">56</td>     </tr>   </tbody></table>  <br/>  <p>to the following format:</p>  <table cellspacing="1" cellpadding="1" border="0"><tbody>     <tr style="height: 25px; text-align: center; color: rgb(255, 255, 255); vertical-align: middle; background-color: rgb(80, 80, 80);">       <th width="196">Time</th>        <th width="35">Id</th>        <th width="120">Type</th>        <th width="120">Value</th>     </tr>      <tr style="height: 25px; text-align: center; vertical-align: middle;">       <td width="196">2015-12-16T10:00:01.0000000Z</td>        <td width="35">01</td>        <td width="120">P1</td>        <td width="120">15</td>     </tr>      <tr style="height: 25px; text-align: center; vertical-align: middle;">       <td width="196">2015-12-16T10:00:01.0000000Z</td>        <td width="35">01</td>        <td width="120">P2</td>        <td width="120">30</td>     </tr>      <tr style="height: 25px; text-align: center; vertical-align: middle;">       <td width="196">2015-12-16T10:00:01.0000000Z</td>        <td width="35">01</td>        <td width="120">P3</td>        <td width="120">10</td>     </tr>      <tr style="height: 25px; text-align: center; vertical-align: middle;">       <td width="196">2015-12-16T10:00:01.0000000Z</td>        <td width="35">02</td>        <td width="120">P1</td>        <td width="120">25</td>     </tr>      <tr style="height: 25px; text-align: center; vertical-align: middle;">       <td width="196">2015-12-16T10:00:01.0000000Z</td>        <td width="35">02</td>        <td width="120">P2</td>        <td width="120">40</td>     </tr>      <tr style="height: 25px; text-align: center; vertical-align: middle;">       <td width="196">2015-12-16T10:00:01.0000000Z</td>        <td width="35">02</td>        <td width="120">P3</td>        <td width="120">20</td>     </tr>      <tr style="height: 25px; text-align: center; vertical-align: middle;">       <td width="196">2015-12-16T10:00:01.0000000Z</td>        <td width="35">03</td>        <td width="120">P1</td>        <td width="120">45</td>     </tr>      <tr style="height: 25px; text-align: center; vertical-align: middle;">       <td width="196">2015-12-16T10:00:01.0000000Z</td>        <td width="35">03</td>        <td width="120">P2</td>        <td width="120">18</td>     </tr>      <tr style="height: 25px; text-align: center; vertical-align: middle;">       <td width="196">2015-12-16T10:00:01.0000000Z</td>        <td width="35">03</td>        <td width="120">P3</td>        <td width="120">5</td>     </tr>      <tr style="height: 25px; text-align: center; vertical-align: middle;">       <td width="196">2015-12-16T10:00:01.0000000Z</td>        <td width="35">04</td>        <td width="120">P1</td>        <td width="120">20</td>     </tr>      <tr style="height: 25px; text-align: center; vertical-align: middle;">       <td width="196">2015-12-16T10:00:01.0000000Z</td>        <td width="35">04</td>        <td width="120">P2</td>        <td width="120">23</td>     </tr>      <tr style="height: 25px; text-align: center; vertical-align: middle;">       <td width="196">2015-12-16T10:00:01.0000000Z</td>        <td width="35">04</td>        <td width="120">P3</td>        <td width="120">56</td>     </tr>   </tbody></table>  <br/>  <p>you can use the <a href="https://msdn.microsoft.com/en-us/library/azure/mt270221.aspx">GetRecordProperties</a> function and <a href="https://msdn.microsoft.com/en-us/library/azure/dn706229.aspx">CROSS APPLY</a> operator as shown by the following query:</p>  <pre class="csharpcode"><span class="kwrd">SELECT</span> e.<span class="kwrd">Time</span>, e.Id, record.PropertyName <span class="kwrd">as</span> Type, record.PropertyValue <span class="kwrd">AS</span> <span class="kwrd">Value</span>
<span class="kwrd">FROM</span> Events e
<span class="kwrd">CROSS</span> APPLY GetRecordProperties (e) <span class="kwrd">AS</span> record
<span class="kwrd">WHERE</span> record.PropertyName = <span class="str">'p3'</span> <span class="kwrd">OR</span>
      record.PropertyName = <span class="str">'p2'</span> <span class="kwrd">OR</span>
      record.PropertyName = <span class="str">'p3'</span></pre>


<p>You can use the following input file to test the Stream Analytics query on the Azure Management portal.</p>

<div id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:105da001-8b33-434d-b715-b30326be22ad" class="wlWriterEditableSmartContent" style="margin: 0px; padding: 0px; float: none; display: inline;"><pre style="background-color:#FFFFFF;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;overflow: auto;"><span style="color: #000000;">[
  {
    </span><span style="color: #800000;">"</span><span style="color: #800000;">Time</span><span style="color: #800000;">"</span><span style="color: #000000;">: </span><span style="color: #800000;">"</span><span style="color: #800000;">2015-12-16T10:00:01.0000000Z</span><span style="color: #800000;">"</span><span style="color: #000000;">,
    </span><span style="color: #800000;">"</span><span style="color: #800000;">Id</span><span style="color: #800000;">"</span><span style="color: #000000;">: </span><span style="color: #800000;">"</span><span style="color: #800000;">01</span><span style="color: #800000;">"</span><span style="color: #000000;">,
    </span><span style="color: #800000;">"</span><span style="color: #800000;">P1</span><span style="color: #800000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">15</span><span style="color: #000000;">,
    </span><span style="color: #800000;">"</span><span style="color: #800000;">P2</span><span style="color: #800000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">30</span><span style="color: #000000;">,
    </span><span style="color: #800000;">"</span><span style="color: #800000;">P3</span><span style="color: #800000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">10</span><span style="color: #000000;">,
  },
  {
    </span><span style="color: #800000;">"</span><span style="color: #800000;">Time</span><span style="color: #800000;">"</span><span style="color: #000000;">: </span><span style="color: #800000;">"</span><span style="color: #800000;">2015-12-16T10:00:01.0000000Z</span><span style="color: #800000;">"</span><span style="color: #000000;">,
    </span><span style="color: #800000;">"</span><span style="color: #800000;">Id</span><span style="color: #800000;">"</span><span style="color: #000000;">: </span><span style="color: #800000;">"</span><span style="color: #800000;">02</span><span style="color: #800000;">"</span><span style="color: #000000;">,
    </span><span style="color: #800000;">"</span><span style="color: #800000;">P1</span><span style="color: #800000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">25</span><span style="color: #000000;">,
    </span><span style="color: #800000;">"</span><span style="color: #800000;">P2</span><span style="color: #800000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">40</span><span style="color: #000000;">,
    </span><span style="color: #800000;">"</span><span style="color: #800000;">P3</span><span style="color: #800000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">20</span><span style="color: #000000;">,
  },
  {
    </span><span style="color: #800000;">"</span><span style="color: #800000;">Time</span><span style="color: #800000;">"</span><span style="color: #000000;">: </span><span style="color: #800000;">"</span><span style="color: #800000;">2015-12-16T10:00:01.0000000Z</span><span style="color: #800000;">"</span><span style="color: #000000;">,
    </span><span style="color: #800000;">"</span><span style="color: #800000;">Id</span><span style="color: #800000;">"</span><span style="color: #000000;">: </span><span style="color: #800000;">"</span><span style="color: #800000;">03</span><span style="color: #800000;">"</span><span style="color: #000000;">,
    </span><span style="color: #800000;">"</span><span style="color: #800000;">P1</span><span style="color: #800000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">45</span><span style="color: #000000;">,
    </span><span style="color: #800000;">"</span><span style="color: #800000;">P2</span><span style="color: #800000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">18</span><span style="color: #000000;">,
    </span><span style="color: #800000;">"</span><span style="color: #800000;">P3</span><span style="color: #800000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">5</span><span style="color: #000000;">,
  },
  {
    </span><span style="color: #800000;">"</span><span style="color: #800000;">Time</span><span style="color: #800000;">"</span><span style="color: #000000;">: </span><span style="color: #800000;">"</span><span style="color: #800000;">2015-12-16T10:00:01.0000000Z</span><span style="color: #800000;">"</span><span style="color: #000000;">,
    </span><span style="color: #800000;">"</span><span style="color: #800000;">Id</span><span style="color: #800000;">"</span><span style="color: #000000;">: </span><span style="color: #800000;">"</span><span style="color: #800000;">04</span><span style="color: #800000;">"</span><span style="color: #000000;">,
    </span><span style="color: #800000;">"</span><span style="color: #800000;">P1</span><span style="color: #800000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">20</span><span style="color: #000000;">,
    </span><span style="color: #800000;">"</span><span style="color: #800000;">P2</span><span style="color: #800000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">23</span><span style="color: #000000;">,
    </span><span style="color: #800000;">"</span><span style="color: #800000;">P3</span><span style="color: #800000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">56</span><span style="color: #000000;">,
  }
]
</span></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --></div>


Running the query against the test file returns the following dataset: 
<p/>

<table cellspacing="1" cellpadding="1" border="0"><tbody>
    <tr style="height: 25px; text-align: center; color: rgb(255, 255, 255); vertical-align: middle; background-color: rgb(80, 80, 80);">
      <th width="196">Time</th>

      <th width="35">Id</th>

      <th width="120">Type</th>

      <th width="120">Value</th>
    </tr>

    <tr style="height: 25px; text-align: center; vertical-align: middle;">
      <td width="196">2015-12-16T10:00:01.0000000Z</td>

      <td width="35">01</td>

      <td width="120">P1</td>

      <td width="120">15</td>
    </tr>

    <tr style="height: 25px; text-align: center; vertical-align: middle;">
      <td width="196">2015-12-16T10:00:01.0000000Z</td>

      <td width="35">01</td>

      <td width="120">P2</td>

      <td width="120">30</td>
    </tr>

    <tr style="height: 25px; text-align: center; vertical-align: middle;">
      <td width="196">2015-12-16T10:00:01.0000000Z</td>

      <td width="35">01</td>

      <td width="120">P3</td>

      <td width="120">10</td>
    </tr>

    <tr style="height: 25px; text-align: center; vertical-align: middle;">
      <td width="196">2015-12-16T10:00:01.0000000Z</td>

      <td width="35">02</td>

      <td width="120">P1</td>

      <td width="120">25</td>
    </tr>

    <tr style="height: 25px; text-align: center; vertical-align: middle;">
      <td width="196">2015-12-16T10:00:01.0000000Z</td>

      <td width="35">02</td>

      <td width="120">P2</td>

      <td width="120">40</td>
    </tr>

    <tr style="height: 25px; text-align: center; vertical-align: middle;">
      <td width="196">2015-12-16T10:00:01.0000000Z</td>

      <td width="35">02</td>

      <td width="120">P3</td>

      <td width="120">20</td>
    </tr>

    <tr style="height: 25px; text-align: center; vertical-align: middle;">
      <td width="196">2015-12-16T10:00:01.0000000Z</td>

      <td width="35">03</td>

      <td width="120">P1</td>

      <td width="120">45</td>
    </tr>

    <tr style="height: 25px; text-align: center; vertical-align: middle;">
      <td width="196">2015-12-16T10:00:01.0000000Z</td>

      <td width="35">03</td>

      <td width="120">P2</td>

      <td width="120">18</td>
    </tr>

    <tr style="height: 25px; text-align: center; vertical-align: middle;">
      <td width="196">2015-12-16T10:00:01.0000000Z</td>

      <td width="35">03</td>

      <td width="120">P3</td>

      <td width="120">5</td>
    </tr>

    <tr style="height: 25px; text-align: center; vertical-align: middle;">
      <td width="196">2015-12-16T10:00:01.0000000Z</td>

      <td width="35">04</td>

      <td width="120">P1</td>

      <td width="120">20</td>
    </tr>

    <tr style="height: 25px; text-align: center; vertical-align: middle;">
      <td width="196">2015-12-16T10:00:01.0000000Z</td>

      <td width="35">04</td>

      <td width="120">P2</td>

      <td width="120">23</td>
    </tr>

    <tr style="height: 25px; text-align: center; vertical-align: middle;">
      <td width="196">2015-12-16T10:00:01.0000000Z</td>

      <td width="35">04</td>

      <td width="120">P3</td>

      <td width="120">56</td>
    </tr>
  </tbody></table>]]></content:encoded>
    </item>
    <item>
      <title>How to find absence of signal in a Stream Analytics job</title>
      <link>https://docs.microsoft.com/archive/blogs/paolos/how-to-find-absence-of-signal-in-a-stream-analytics-job</link>
      <pubDate>Thu, 17 Dec 2015 08:05:26 GMT</pubDate>
      <dc:creator><![CDATA[Paolo Salvatori]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/paolos/2015/12/17/how-to-find-absence-of-signal-in-a-stream-analytics-job/</guid>
      <description><![CDATA[Introduction  Recently, I worked at an IoT solution where the customer had to build a Stream...]]></description>
      <content:encoded><![CDATA[<h1 align="justify">Introduction</h1>  <p align="justify">Recently, I worked at an IoT solution where the customer had to build a Stream Analytics query to check when no data has arrived from a given device in a configurable time window. To solve this problem, the idea is to correlate the data stream containing real-time events (e.g. sensor readings) with device reference data. In this context, real-time data comes through a data stream input that uses the Event Hub or IoT Hub provider for telemetry data ingestion, whereas the reference data is defined as a blob which contains the metadata of all the devices In the sample below, JSON format is used both by the data stream and reference data, but you can use another format between those supported by Stream Analytics providers.. Now, in order to find all the devices that didn’t send a message within a given time window, reference data input should appear in the Stream Analytics query as the left element of the LEFT JOIN clause. But Stream Analytics does not support Reference Data as the left element in a JOIN clause L So I had to tweak the code to bring Reference Data on the left part. However, at least at the time of this writing, Stream Analytics does not support Reference Data as the left element in a JOIN clause. So I had to tweak the code to bring reference data on the left part. This article describes this technique. Basically, you have to create a multi-step query as follows:</p>  <ol>   <li>     <div align="justify">The first step in the query below simply creates a single event every N seconds (60 in my sample). </div>   </li>    <li>     <div align="justify">The second step joins reference data with the result of the first step to turn reference data into a temporal data stream. This way I can bring reference data on the left of a JOIN clause. Please note the use of the ON clause. This is sort of magic trick to correlate the event produced by the first query with the reference data.</div>   </li>    <li>     <div align="justify">The third step calculates the event count for each device in the given time window. Note: the duration of the time window needs to be equal to the duration of the time window used by the first step.</div>   </li>    <li>     <div align="justify">The final SELECT applies a LEFT JOIN to the output of the second step and the output of third step. Since the second step was obtained from reference data, which contains all the devices, and the reference data appears as the left element of a LEFT JOIN, the query will analyze all the devices, not only those that sent at least a message in the current time window.</div>   </li> </ol>  <h1 align="justify">Test Files</h1>  <p align="justify">This section contains the test files used on the QUERY tab on the Azure Management Portal to test the query.</p>  <h3 align="justify">DeviceEvents.Json</h3>  <pre class="csharpcode">[
    {
        <span class="str">&quot;deviceId&quot;</span>:1,
        <span class="str">&quot;name&quot;</span>:<span class="str">&quot;device001&quot;</span>,
        <span class="str">&quot;value&quot;</span>: 5,
        <span class="str">&quot;status&quot;</span>: <span class="str">&quot;active&quot;</span>,
        <span class="str">&quot;timestamp&quot;</span>: <span class="str">&quot;2015-12-16T10:00:00.0000000Z&quot;</span>
    },
    {
        <span class="str">&quot;deviceId&quot;</span>:3,
        <span class="str">&quot;name&quot;</span>:<span class="str">&quot;device003&quot;</span>,
        <span class="str">&quot;value&quot;</span>:23,
        <span class="str">&quot;status&quot;</span>: <span class="str">&quot;active&quot;</span>,
        <span class="str">&quot;timestamp&quot;</span>: <span class="str">&quot;2015-12-16T10:00:05.0000000Z&quot;</span>
    },
    {
        <span class="str">&quot;deviceId&quot;</span>:5,
        <span class="str">&quot;name&quot;</span>:<span class="str">&quot;device005&quot;</span>,
        <span class="str">&quot;value&quot;</span>:17,
        <span class="str">&quot;status&quot;</span>: <span class="str">&quot;active&quot;</span>,
        <span class="str">&quot;timestamp&quot;</span>: <span class="str">&quot;2015-12-16T10:00:20.0000000Z&quot;</span>
    },
    {
        <span class="str">&quot;deviceId&quot;</span>:1,
        <span class="str">&quot;name&quot;</span>:<span class="str">&quot;device001&quot;</span>,
        <span class="str">&quot;value&quot;</span>:8,
        <span class="str">&quot;status&quot;</span>: <span class="str">&quot;active&quot;</span>,
        <span class="str">&quot;timestamp&quot;</span>: <span class="str">&quot;2015-12-16T10:00:30.0000000Z&quot;</span>
    },
    {
        <span class="str">&quot;deviceId&quot;</span>:3,
        <span class="str">&quot;name&quot;</span>:<span class="str">&quot;device003&quot;</span>,
        <span class="str">&quot;value&quot;</span>:22,
        <span class="str">&quot;status&quot;</span>: <span class="str">&quot;active&quot;</span>,
        <span class="str">&quot;timestamp&quot;</span>: <span class="str">&quot;2015-12-16T10:00:35.0000000Z&quot;</span>
    },
    {
        <span class="str">&quot;deviceId&quot;</span>:4,
        <span class="str">&quot;name&quot;</span>:<span class="str">&quot;device004&quot;</span>,
        <span class="str">&quot;value&quot;</span>: 18,
        <span class="str">&quot;status&quot;</span>: <span class="str">&quot;active&quot;</span>,
        <span class="str">&quot;timestamp&quot;</span>: <span class="str">&quot;2015-12-16T10:00:36.0000000Z&quot;</span>
    },
    {
        <span class="str">&quot;deviceId&quot;</span>:1,
        <span class="str">&quot;name&quot;</span>:<span class="str">&quot;device001&quot;</span>,
        <span class="str">&quot;value&quot;</span>:65,
        <span class="str">&quot;status&quot;</span>: <span class="str">&quot;active&quot;</span>,
        <span class="str">&quot;timestamp&quot;</span>: <span class="str">&quot;2015-12-16T10:01:00.0000000Z&quot;</span>
    },
    {
        <span class="str">&quot;deviceId&quot;</span>:3,
        <span class="str">&quot;name&quot;</span>:<span class="str">&quot;device003&quot;</span>,
        <span class="str">&quot;value&quot;</span>:28,
        <span class="str">&quot;status&quot;</span>: <span class="str">&quot;active&quot;</span>,
        <span class="str">&quot;timestamp&quot;</span>: <span class="str">&quot;2015-12-16T10:01:05.0000000Z&quot;</span>
    },
    {
        <span class="str">&quot;deviceId&quot;</span>:5,
        <span class="str">&quot;name&quot;</span>:<span class="str">&quot;device005&quot;</span>,
        <span class="str">&quot;value&quot;</span>:3,
        <span class="str">&quot;status&quot;</span>: <span class="str">&quot;active&quot;</span>,
        <span class="str">&quot;timestamp&quot;</span>: <span class="str">&quot;2015-12-16T10:01:15.0000000Z&quot;</span>
    },
    {
        <span class="str">&quot;deviceId&quot;</span>:1,
        <span class="str">&quot;name&quot;</span>:<span class="str">&quot;device001&quot;</span>,
        <span class="str">&quot;value&quot;</span>:54,
        <span class="str">&quot;status&quot;</span>: <span class="str">&quot;active&quot;</span>,
        <span class="str">&quot;timestamp&quot;</span>: <span class="str">&quot;2015-12-16T10:01:30.0000000Z&quot;</span>
    },
    {
        <span class="str">&quot;deviceId&quot;</span>:3,
        <span class="str">&quot;name&quot;</span>:<span class="str">&quot;device003&quot;</span>,
        <span class="str">&quot;value&quot;</span>:43,
        <span class="str">&quot;status&quot;</span>: <span class="str">&quot;active&quot;</span>,
        <span class="str">&quot;timestamp&quot;</span>: <span class="str">&quot;2015-12-16T10:01:35.0000000Z&quot;</span>
    }
]</pre>


<h4>Remarks:</h4>

<ul>
  <li>Please look at the timestamp of the events: events are contained in about 2 minutes time range. Hence, they are segmented in 3 consecutive time windows of 60 seconds each.</li>

  <li>Device with deviceId = 2 does not produce any events </li>

  <li>Device with deviceId = 4 produces a single event in the second time window</li>
</ul>

<h3>DeviceReferenceData.json</h3>

<p>This file needs to be copied to blob storage and used as reference data. It contains a record for each device.</p>

<pre class="csharpcode">[
    {
        <span class="str">&quot;deviceId&quot;</span>: 1,
        <span class="str">&quot;location&quot;</span>: <span class="str">&quot;Milan&quot;</span>,
        <span class="str">&quot;building&quot;</span>: <span class="str">&quot;A01&quot;</span>,
        <span class="str">&quot;minThreshold&quot;</span>: 20.0,
        <span class="str">&quot;maxThreshold&quot;</span>: 50.0
    },
    {
        <span class="str">&quot;deviceId&quot;</span>: 2,
        <span class="str">&quot;location&quot;</span>: <span class="str">&quot;Milan&quot;</span>,
        <span class="str">&quot;building&quot;</span>: <span class="str">&quot;A01&quot;</span>,
        <span class="str">&quot;minThreshold&quot;</span>: 20.0,
        <span class="str">&quot;maxThreshold&quot;</span>: 50.0
    },
    {
        <span class="str">&quot;deviceId&quot;</span>: 3,
        <span class="str">&quot;location&quot;</span>: <span class="str">&quot;Milan&quot;</span>,
        <span class="str">&quot;building&quot;</span>: <span class="str">&quot;A01&quot;</span>,
        <span class="str">&quot;minThreshold&quot;</span>: 20.0,
        <span class="str">&quot;maxThreshold&quot;</span>: 50.0
    },
    {
        <span class="str">&quot;deviceId&quot;</span>: 4,
        <span class="str">&quot;location&quot;</span>: <span class="str">&quot;Milan&quot;</span>,
        <span class="str">&quot;building&quot;</span>: <span class="str">&quot;A01&quot;</span>,
        <span class="str">&quot;minThreshold&quot;</span>: 20.0,
        <span class="str">&quot;maxThreshold&quot;</span>: 50.0
    },
    {
        <span class="str">&quot;deviceId&quot;</span>: 5,
        <span class="str">&quot;location&quot;</span>: <span class="str">&quot;Milan&quot;</span>,
        <span class="str">&quot;building&quot;</span>: <span class="str">&quot;A02&quot;</span>,
        <span class="str">&quot;minThreshold&quot;</span>: 20.0,
        <span class="str">&quot;maxThreshold&quot;</span>: 40.0
    }
]</pre>


<h1 align="justify">First Query</h1>

<p>In the first query, I calculate how many events have been received from each device in a given time window.</p>

<div id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:119aefaf-bc2d-4942-8249-56f241ed57d6" class="wlWriterEditableSmartContent" style="margin: 0px; padding: 0px; float: none; display: inline;"><pre style="background-color:#FFFFFF;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;overflow: auto;"><span style="color: #008080;">--</span><span style="color: #008080;"> Find devices that it's at least 1 minute that don't send a message</span><span style="color: #008080;">
</span><span style="color: #0000FF;">WITH</span><span style="color: #000000;">
OneEvent </span><span style="color: #0000FF;">AS</span><span style="color: #000000;"> </span><span style="color: #008080;">/*</span><span style="color: #008080;"> generate one event per period, any event </span><span style="color: #008080;">*/</span><span style="color: #000000;">
(
                </span><span style="color: #0000FF;">SELECT</span><span style="color: #000000;"> </span><span style="color: #FF00FF;">COUNT</span><span style="color: #000000;">(</span><span style="color: #808080;">*</span><span style="color: #000000;">) </span><span style="color: #0000FF;">As</span><span style="color: #000000;"> eventCount
                </span><span style="color: #0000FF;">FROM</span><span style="color: #000000;"> DeviceEvents </span><span style="color: #0000FF;">TIMESTAMP</span><span style="color: #000000;"> </span><span style="color: #0000FF;">BY</span><span style="color: #000000;"> DeviceEvents.</span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">timestamp</span><span style="color: #FF0000;">]</span><span style="color: #000000;">
                </span><span style="color: #0000FF;">GROUP</span><span style="color: #000000;"> </span><span style="color: #0000FF;">BY</span><span style="color: #000000;"> TumblingWindow(s, </span><span style="color: #800000; font-weight: bold;">60</span><span style="color: #000000;">)
),
AllDevices </span><span style="color: #0000FF;">AS</span><span style="color: #000000;"> </span><span style="color: #008080;">/*</span><span style="color: #008080;"> generate one event per deviceId per period </span><span style="color: #008080;">*/</span><span style="color: #000000;">
(
                </span><span style="color: #0000FF;">SELECT</span><span style="color: #000000;"> ReferenceData.deviceId
                </span><span style="color: #0000FF;">FROM</span><span style="color: #000000;"> OneEvent </span><span style="color: #808080;">JOIN</span><span style="color: #000000;"> ReferenceData
                </span><span style="color: #0000FF;">ON</span><span style="color: #000000;"> OneEvent.eventCount </span><span style="color: #808080;">-</span><span style="color: #000000;"> OneEvent.eventCount </span><span style="color: #808080;">=</span><span style="color: #000000;"> ReferenceData.deviceId </span><span style="color: #808080;">-</span><span style="color: #000000;"> ReferenceData.deviceId
),
ActualCounts </span><span style="color: #0000FF;">AS</span><span style="color: #000000;"> </span><span style="color: #008080;">/*</span><span style="color: #008080;"> compute how many events have been received in the time window from each device </span><span style="color: #008080;">*/</span><span style="color: #000000;">
(
                </span><span style="color: #0000FF;">SELECT</span><span style="color: #000000;"> deviceId,
                       </span><span style="color: #FF00FF;">COUNT</span><span style="color: #000000;">(</span><span style="color: #808080;">*</span><span style="color: #000000;">) </span><span style="color: #0000FF;">AS</span><span style="color: #000000;"> eventCount
                </span><span style="color: #0000FF;">FROM</span><span style="color: #000000;"> DeviceEvents </span><span style="color: #0000FF;">TIMESTAMP</span><span style="color: #000000;"> </span><span style="color: #0000FF;">BY</span><span style="color: #000000;"> DeviceEvents.</span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">timestamp</span><span style="color: #FF0000;">]</span><span style="color: #000000;">
                </span><span style="color: #0000FF;">GROUP</span><span style="color: #000000;"> </span><span style="color: #0000FF;">BY</span><span style="color: #000000;"> TumblingWindow(s, </span><span style="color: #800000; font-weight: bold;">60</span><span style="color: #000000;">), deviceId
)
</span><span style="color: #008080;">/*</span><span style="color: #008080;"> left join AllDevices with ActualCounts to find devices with zero events </span><span style="color: #008080;">*/</span><span style="color: #000000;">
</span><span style="color: #0000FF;">SELECT</span><span style="color: #000000;">
      AllDevices.deviceId,
      </span><span style="color: #FF00FF;">CASE</span><span style="color: #000000;"> </span><span style="color: #0000FF;">WHEN</span><span style="color: #000000;"> ActualCounts.eventCount </span><span style="color: #0000FF;">IS</span><span style="color: #000000;"> </span><span style="color: #0000FF;">NULL</span><span style="color: #000000;"> </span><span style="color: #0000FF;">THEN</span><span style="color: #000000;"> </span><span style="color: #800000; font-weight: bold;">0</span><span style="color: #000000;">
           </span><span style="color: #0000FF;">ELSE</span><span style="color: #000000;"> ActualCounts.eventCount
      </span><span style="color: #0000FF;">END</span><span style="color: #000000;"> </span><span style="color: #0000FF;">AS</span><span style="color: #000000;"> eventCount,
      System.</span><span style="color: #0000FF;">Timestamp</span><span style="color: #000000;"> </span><span style="color: #0000FF;">AS</span><span style="color: #000000;"> </span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">timestamp</span><span style="color: #FF0000;">]</span><span style="color: #000000;">
</span><span style="color: #0000FF;">FROM</span><span style="color: #000000;">
AllDevices </span><span style="color: #808080;">LEFT</span><span style="color: #000000;"> </span><span style="color: #808080;">JOIN</span><span style="color: #000000;"> ActualCounts
</span><span style="color: #0000FF;">ON</span><span style="color: #000000;">
ActualCounts.deviceId </span><span style="color: #808080;">=</span><span style="color: #000000;"> AllDevices.deviceId
</span><span style="color: #808080;">AND</span><span style="color: #000000;"> </span><span style="color: #FF00FF;">DATEDIFF</span><span style="color: #000000;">(ms, ActualCounts, AllDevices) </span><span style="color: #808080;">=</span><span style="color: #000000;"> </span><span style="color: #800000; font-weight: bold;">0</span></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --></div>

<h1 align="justify">Test First Query</h1>

<p align="justify">If you test the first query with using <strong>DeviceEvents.json</strong> and <strong>DeviceReferenceData.json</strong> as test files, you will get the following results. Please note, that in the figure below results are contained in 3 consecutive time windows that are highlighted in 3 different colors.</p>

<p align="justify"><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/08/22/metablogapi/8117.image1_0B9102FE.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-08-22-metablogapi/8117.image1_5F00_0B9102FE.png"><img title="image1" style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="image1" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/08/22/metablogapi/4162.image1_thumb_51A1C011.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-08-22-metablogapi/4162.image1_5F00_thumb_5F00_51A1C011.png" width="900" height="685" /></a></p>

<h1 align="justify">Second Query</h1>

<p>In the second query, it’s sufficient to add a WHERE clause to project only the devices that didn’t produce any event in the given time window.</p>

<div id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:48b68dd6-f3d7-4725-b50a-ee85d2ef0e8b" class="wlWriterEditableSmartContent" style="margin: 0px; padding: 0px; float: none; display: inline;"><pre style="background-color:#FFFFFF;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;overflow: auto;"><span style="color: #008080;">--</span><span style="color: #008080;"> Find devices that it's at least 1 minute that don't send a message</span><span style="color: #008080;">
</span><span style="color: #0000FF;">WITH</span><span style="color: #000000;">
OneEvent </span><span style="color: #0000FF;">AS</span><span style="color: #000000;"> </span><span style="color: #008080;">/*</span><span style="color: #008080;"> generate one event per period, any event </span><span style="color: #008080;">*/</span><span style="color: #000000;">
(
                </span><span style="color: #0000FF;">SELECT</span><span style="color: #000000;"> </span><span style="color: #FF00FF;">COUNT</span><span style="color: #000000;">(</span><span style="color: #808080;">*</span><span style="color: #000000;">) </span><span style="color: #0000FF;">As</span><span style="color: #000000;"> eventCount
                </span><span style="color: #0000FF;">FROM</span><span style="color: #000000;"> DeviceEvents </span><span style="color: #0000FF;">TIMESTAMP</span><span style="color: #000000;"> </span><span style="color: #0000FF;">BY</span><span style="color: #000000;"> DeviceEvents.</span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">timestamp</span><span style="color: #FF0000;">]</span><span style="color: #000000;">
                </span><span style="color: #0000FF;">GROUP</span><span style="color: #000000;"> </span><span style="color: #0000FF;">BY</span><span style="color: #000000;"> TumblingWindow(s, </span><span style="color: #800000; font-weight: bold;">60</span><span style="color: #000000;">)
),
AllDevices </span><span style="color: #0000FF;">AS</span><span style="color: #000000;"> </span><span style="color: #008080;">/*</span><span style="color: #008080;"> generate one event per deviceId per period </span><span style="color: #008080;">*/</span><span style="color: #000000;">
(
                </span><span style="color: #0000FF;">SELECT</span><span style="color: #000000;"> ReferenceData.deviceId
                </span><span style="color: #0000FF;">FROM</span><span style="color: #000000;"> OneEvent </span><span style="color: #808080;">JOIN</span><span style="color: #000000;"> ReferenceData
                </span><span style="color: #0000FF;">ON</span><span style="color: #000000;"> OneEvent.eventCount </span><span style="color: #808080;">-</span><span style="color: #000000;"> OneEvent.eventCount </span><span style="color: #808080;">=</span><span style="color: #000000;"> ReferenceData.deviceId </span><span style="color: #808080;">-</span><span style="color: #000000;"> ReferenceData.deviceId
),
ActualCounts </span><span style="color: #0000FF;">AS</span><span style="color: #000000;"> </span><span style="color: #008080;">/*</span><span style="color: #008080;"> compute how many events have been received in the time window from each device </span><span style="color: #008080;">*/</span><span style="color: #000000;">
(
                </span><span style="color: #0000FF;">SELECT</span><span style="color: #000000;"> deviceId,
                       </span><span style="color: #FF00FF;">COUNT</span><span style="color: #000000;">(</span><span style="color: #808080;">*</span><span style="color: #000000;">) </span><span style="color: #0000FF;">AS</span><span style="color: #000000;"> eventCount
                </span><span style="color: #0000FF;">FROM</span><span style="color: #000000;"> DeviceEvents </span><span style="color: #0000FF;">TIMESTAMP</span><span style="color: #000000;"> </span><span style="color: #0000FF;">BY</span><span style="color: #000000;"> DeviceEvents.</span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">timestamp</span><span style="color: #FF0000;">]</span><span style="color: #000000;">
                </span><span style="color: #0000FF;">GROUP</span><span style="color: #000000;"> </span><span style="color: #0000FF;">BY</span><span style="color: #000000;"> TumblingWindow(s, </span><span style="color: #800000; font-weight: bold;">60</span><span style="color: #000000;">), deviceId
)
</span><span style="color: #008080;">/*</span><span style="color: #008080;"> left join AllDevices with ActualCounts to find devices with zero events </span><span style="color: #008080;">*/</span><span style="color: #000000;">
</span><span style="color: #0000FF;">SELECT</span><span style="color: #000000;">
      AllDevices.deviceId,
      </span><span style="color: #FF00FF;">CASE</span><span style="color: #000000;"> </span><span style="color: #0000FF;">WHEN</span><span style="color: #000000;"> ActualCounts.eventCount </span><span style="color: #0000FF;">IS</span><span style="color: #000000;"> </span><span style="color: #0000FF;">NULL</span><span style="color: #000000;"> </span><span style="color: #0000FF;">THEN</span><span style="color: #000000;"> </span><span style="color: #800000; font-weight: bold;">0</span><span style="color: #000000;">
           </span><span style="color: #0000FF;">ELSE</span><span style="color: #000000;"> ActualCounts.eventCount
      </span><span style="color: #0000FF;">END</span><span style="color: #000000;"> </span><span style="color: #0000FF;">AS</span><span style="color: #000000;"> eventCount,
      System.</span><span style="color: #0000FF;">Timestamp</span><span style="color: #000000;"> </span><span style="color: #0000FF;">AS</span><span style="color: #000000;"> </span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">timestamp</span><span style="color: #FF0000;">]</span><span style="color: #000000;">
</span><span style="color: #0000FF;">FROM</span><span style="color: #000000;">
AllDevices </span><span style="color: #808080;">LEFT</span><span style="color: #000000;"> </span><span style="color: #808080;">JOIN</span><span style="color: #000000;"> ActualCounts
</span><span style="color: #0000FF;">ON</span><span style="color: #000000;">
ActualCounts.deviceId </span><span style="color: #808080;">=</span><span style="color: #000000;"> AllDevices.deviceId
</span><span style="color: #808080;">AND</span><span style="color: #000000;"> </span><span style="color: #FF00FF;">DATEDIFF</span><span style="color: #000000;">(ms, ActualCounts, AllDevices) </span><span style="color: #808080;">=</span><span style="color: #000000;"> </span><span style="color: #800000; font-weight: bold;">0</span><span style="color: #000000;">
</span><span style="color: #0000FF;">WHERE</span><span style="color: #000000;"> ActualCounts.eventCount </span><span style="color: #0000FF;">IS</span><span style="color: #000000;"> </span><span style="color: #0000FF;">NULL</span></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --></div>

<h1>Test Second Query</h1>

<p>If you test the first query with using <strong>DeviceEvents.json</strong> and <strong>DeviceReferenceData.json</strong> as test files, you will get the following results. Please note, that in the figure below results are contained in 3 consecutive time windows that are highlighted in 3 different colors.</p>

<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/08/22/metablogapi/3771.Image2_1650EB04.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-08-22-metablogapi/3771.Image2_5F00_1650EB04.png"><img title="Image2" style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="Image2" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/08/22/metablogapi/1526.Image2_thumb_3CB2CE4F.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-08-22-metablogapi/1526.Image2_5F00_thumb_5F00_3CB2CE4F.png" width="900" height="458" /></a></p>

<h1>Architecture Design</h1>

<p>The following picture shows the architecture design of the demo. You can use my tool, <a href="https://code.msdn.microsoft.com/windowsapps/Service-Bus-Explorer-f2abca5a">Service Bus Explorer</a>, to send device events to the input Event Hub and receive results from the output Event Hub. </p>

<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/08/22/metablogapi/5710.Architecture_335999CC.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-08-22-metablogapi/5710.Architecture_5F00_335999CC.png"><img title="Architecture" style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="Architecture" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/08/22/metablogapi/7610.Architecture_thumb_2A006549.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-08-22-metablogapi/7610.Architecture_5F00_thumb_5F00_2A006549.png" width="900" height="278" /></a></p>

<h4 align="justify">Inputs:</h4>

<ul>
  <li>
    <div align="justify"><strong>DeviceEvents</strong>: Event Hub Data Stream</div>
  </li>

  <li>
    <div align="justify"><strong>ReferenceData</strong>: Blob Reference Data</div>
  </li>
</ul>

<h4 align="justify">&#160;</h4>

<h4 align="justify">Outputs:</h4>

<ul>
  <li>
    <div align="justify"><strong>Output</strong>: Event Hub Output</div>
  </li>
</ul>

<h2 align="justify">Provisoning</h2>

<p align="justify">You can use the following ARM template and parameters file to create the Stream Analytics job. Note: this script creates only the Stream Analytics job and not the Event Hubs and Storage Account hosting the blob used as reference data. You can extend the ARM template to add the creation of the Event Hubs, storage account and container hosting the blob file. Make sure to copy the <strong>DeviceReferenceData.json</strong> to the container at the end of the provisioning process.</p>

<h4 align="justify">azuredeploy.json</h4>

<pre class="csharpcode">{
    <span class="str">&quot;$schema&quot;</span>: <span class="str">&quot;https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json&quot;</span>,
 
    <span class="str">&quot;contentVersion&quot;</span>: <span class="str">&quot;1.0.0.0&quot;</span>,
 
    <span class="str">&quot;parameters&quot;</span>: {
        <span class="str">&quot;jobName&quot;</span>: {
            <span class="str">&quot;type&quot;</span>: <span class="str">&quot;string&quot;</span>,
            <span class="str">&quot;metadata&quot;</span>: {
                <span class="str">&quot;description&quot;</span>: <span class="str">&quot;Name of the Stream Analytics job&quot;</span>,
                <span class="str">&quot;defaultValue&quot;</span>: <span class="str">&quot;IoTDeviceDemo&quot;</span>
            }
        },
        <span class="str">&quot;jobLocation&quot;</span>: {
            <span class="str">&quot;type&quot;</span>: <span class="str">&quot;string&quot;</span>,
            <span class="str">&quot;metadata&quot;</span>: {
                <span class="str">&quot;description&quot;</span>: <span class="str">&quot;Location of the Stream Analytics job&quot;</span>,
                <span class="str">&quot;defaultValue&quot;</span>: <span class="str">&quot;West Europe&quot;</span>
            }
        },
         <span class="str">&quot;referenceStorageAccountName&quot;</span>: {
            <span class="str">&quot;type&quot;</span>: <span class="str">&quot;string&quot;</span>,
            <span class="str">&quot;metadata&quot;</span>: {
                <span class="str">&quot;description&quot;</span>: <span class="str">&quot;Name of the Storage Account containing the reference data blob&quot;</span>
            }
        },
        <span class="str">&quot;referenceStorageAccountKey&quot;</span>: {
            <span class="str">&quot;type&quot;</span>: <span class="str">&quot;string&quot;</span>,
            <span class="str">&quot;metadata&quot;</span>: {
                <span class="str">&quot;description&quot;</span>: <span class="str">&quot;Key of the Storage Account containing the reference data blob&quot;</span>
            }
        },
        <span class="str">&quot;referenceContainerName&quot;</span>: {
            <span class="str">&quot;type&quot;</span>: <span class="str">&quot;string&quot;</span>,
            <span class="str">&quot;metadata&quot;</span>: {
                <span class="str">&quot;description&quot;</span>: <span class="str">&quot;Name of the container of the reference data blob&quot;</span>,
                <span class="str">&quot;defaultValue&quot;</span>: <span class="str">&quot;devices&quot;</span>
            }
        },
        <span class="str">&quot;referenceBlobName&quot;</span>: {
            <span class="str">&quot;type&quot;</span>: <span class="str">&quot;string&quot;</span>,
            <span class="str">&quot;metadata&quot;</span>: {
                <span class="str">&quot;description&quot;</span>: <span class="str">&quot;Name of the reference data blob&quot;</span>,
                <span class="str">&quot;defaultValue&quot;</span>: <span class="str">&quot;DeviceReferenceData.json&quot;</span>
            }
        },
        <span class="str">&quot;inputServiceBusNamespace&quot;</span>: {
            <span class="str">&quot;type&quot;</span>: <span class="str">&quot;string&quot;</span>,
            <span class="str">&quot;metadata&quot;</span>: {
                <span class="str">&quot;description&quot;</span>: <span class="str">&quot;Name of the Service Bus namespace containing the input event hub&quot;</span>
            }
        },
        <span class="str">&quot;inputEventHubName&quot;</span>: {
            <span class="str">&quot;type&quot;</span>: <span class="str">&quot;string&quot;</span>,
            <span class="str">&quot;metadata&quot;</span>: {
                <span class="str">&quot;description&quot;</span>: <span class="str">&quot;Name of the input event hub&quot;</span>
            }
        },
        <span class="str">&quot;inputEventHubConsumerGroupName&quot;</span>: {
            <span class="str">&quot;type&quot;</span>: <span class="str">&quot;string&quot;</span>,
            <span class="str">&quot;metadata&quot;</span>: {
                <span class="str">&quot;description&quot;</span>: <span class="str">&quot;Name of the consumer group used by the job to read data out of the input event hub&quot;</span>,
                <span class="str">&quot;defaultValue&quot;</span>: <span class="str">&quot;$Default&quot;</span>
            }
        },
        <span class="str">&quot;inputEventHubSharedAccessPolicyName&quot;</span>: {
            <span class="str">&quot;type&quot;</span>: <span class="str">&quot;string&quot;</span>,
            <span class="str">&quot;metadata&quot;</span>: {
                <span class="str">&quot;description&quot;</span>: <span class="str">&quot;Name of the Shared Access Policy of the input event hub&quot;</span>
            }
        },
        <span class="str">&quot;inputEventHubSharedAccessPolicyKey&quot;</span>: {
            <span class="str">&quot;type&quot;</span>: <span class="str">&quot;string&quot;</span>,
            <span class="str">&quot;metadata&quot;</span>: {
                <span class="str">&quot;description&quot;</span>: <span class="str">&quot;Key of the Shared Access Policy of the input event hub&quot;</span>
            }
        },
        <span class="str">&quot;outputServiceBusNamespace&quot;</span>: {
            <span class="str">&quot;type&quot;</span>: <span class="str">&quot;string&quot;</span>,
            <span class="str">&quot;metadata&quot;</span>: {
                <span class="str">&quot;description&quot;</span>: <span class="str">&quot;Name of the Service Bus namespace containing the output event hub&quot;</span>
            }
        },
        <span class="str">&quot;outputEventHubName&quot;</span>: {
            <span class="str">&quot;type&quot;</span>: <span class="str">&quot;string&quot;</span>,
            <span class="str">&quot;metadata&quot;</span>: {
                <span class="str">&quot;description&quot;</span>: <span class="str">&quot;Name of the output event hub&quot;</span>
            }
        },
        <span class="str">&quot;outputEventHubPartitionKey&quot;</span>: {
            <span class="str">&quot;type&quot;</span>: <span class="str">&quot;string&quot;</span>,
            <span class="str">&quot;metadata&quot;</span>: {
                <span class="str">&quot;description&quot;</span>: <span class="str">&quot;Name of the payload property used as partition key&quot;</span>
            }
        },
        <span class="str">&quot;outputEventHubSharedAccessPolicyName&quot;</span>: {
            <span class="str">&quot;type&quot;</span>: <span class="str">&quot;string&quot;</span>,
            <span class="str">&quot;metadata&quot;</span>: {
                <span class="str">&quot;description&quot;</span>: <span class="str">&quot;Name of the Shared Access Policy of the output event hub&quot;</span>
            }
        },
        <span class="str">&quot;outputEventHubSharedAccessPolicyKey&quot;</span>: {
            <span class="str">&quot;type&quot;</span>: <span class="str">&quot;string&quot;</span>,
            <span class="str">&quot;metadata&quot;</span>: {
                <span class="str">&quot;description&quot;</span>: <span class="str">&quot;Key of the Shared Access Policy of the output event hub&quot;</span>
            }
        }
    },
    <span class="str">&quot;resources&quot;</span>: [
        {
            <span class="str">&quot;name&quot;</span>: <span class="str">&quot;[parameters('jobName')]&quot;</span>,
            <span class="str">&quot;type&quot;</span>: <span class="str">&quot;Microsoft.StreamAnalytics/streamingjobs&quot;</span>,
            <span class="str">&quot;apiVersion&quot;</span>: <span class="str">&quot;2015-04-01&quot;</span>,
            <span class="str">&quot;location&quot;</span>: <span class="str">&quot;[parameters('jobLocation')]&quot;</span>,
            <span class="str">&quot;properties&quot;</span>: {
                <span class="str">&quot;sku&quot;</span>: {
                    <span class="str">&quot;name&quot;</span>: <span class="str">&quot;Standard&quot;</span>
                },
                <span class="str">&quot;eventsOutOfOrderPolicy&quot;</span>: <span class="str">&quot;Adjust&quot;</span>,
                <span class="str">&quot;eventsOutOfOrderMaxDelayInSeconds&quot;</span>: 0,
                <span class="str">&quot;eventsLateArrivalMaxDelayInSeconds&quot;</span>: 5,
                <span class="str">&quot;dataLocale&quot;</span>: <span class="str">&quot;en-US&quot;</span>,
                <span class="str">&quot;inputs&quot;</span>: [
                    {
                        <span class="str">&quot;name&quot;</span>: <span class="str">&quot;DeviceEvents&quot;</span>,
                        <span class="str">&quot;type&quot;</span>: <span class="str">&quot;Microsoft.StreamAnalytics/streamingjobs/inputs&quot;</span>,
                        <span class="str">&quot;properties&quot;</span>: {
                            <span class="str">&quot;type&quot;</span>: <span class="str">&quot;Stream&quot;</span>,
                            <span class="str">&quot;datasource&quot;</span>: {
                                <span class="str">&quot;type&quot;</span>: <span class="str">&quot;Microsoft.ServiceBus/EventHub&quot;</span>,
                                <span class="str">&quot;properties&quot;</span>: {
                                    <span class="str">&quot;eventHubName&quot;</span>: <span class="str">&quot;[parameters('inputEventHubName')]&quot;</span>,
                                    <span class="str">&quot;consumerGroupName&quot;</span>: <span class="str">&quot;[parameters('inputEventHubConsumerGroupName')]&quot;</span>,
                                    <span class="str">&quot;serviceBusNamespace&quot;</span>: <span class="str">&quot;[parameters('inputServiceBusNamespace')]&quot;</span>,
                                    <span class="str">&quot;sharedAccessPolicyName&quot;</span>: <span class="str">&quot;[parameters('inputEventHubSharedAccessPolicyName')]&quot;</span>,
                                    <span class="str">&quot;sharedAccessPolicyKey&quot;</span>: <span class="str">&quot;[parameters('inputEventHubSharedAccessPolicyKey')]&quot;</span>
                                }
                            },
                            <span class="str">&quot;serialization&quot;</span>: {
                                <span class="str">&quot;type&quot;</span>: <span class="str">&quot;Json&quot;</span>,
                                <span class="str">&quot;properties&quot;</span>: {
                                    <span class="str">&quot;encoding&quot;</span>: <span class="str">&quot;UTF8&quot;</span>
                                }
                            }
                        }
                    },
                    {
                        <span class="str">&quot;name&quot;</span>: <span class="str">&quot;ReferenceData&quot;</span>,
                        <span class="str">&quot;type&quot;</span>: <span class="str">&quot;Microsoft.StreamAnalytics/streamingjobs/inputs&quot;</span>,
                        <span class="str">&quot;properties&quot;</span>: {
                            <span class="str">&quot;type&quot;</span>: <span class="str">&quot;Reference&quot;</span>,
                            <span class="str">&quot;datasource&quot;</span>: {
                                <span class="str">&quot;type&quot;</span>: <span class="str">&quot;Microsoft.Storage/Blob&quot;</span>,
                                <span class="str">&quot;properties&quot;</span>: {
                                    <span class="str">&quot;blobName&quot;</span>: <span class="str">&quot;[parameters('referenceBlobName')]&quot;</span>,
                                    <span class="str">&quot;storageAccounts&quot;</span>: [
                                        {
                                            <span class="str">&quot;accountName&quot;</span>: <span class="str">&quot;[parameters('referenceStorageAccountName')]&quot;</span>,
                                            <span class="str">&quot;accountKey&quot;</span>: <span class="str">&quot;[parameters('referenceStorageAccountKey')]&quot;</span>
                                        }
                                    ],
                                    <span class="str">&quot;container&quot;</span>: <span class="str">&quot;[parameters('referenceContainerName')]&quot;</span>,
                                    <span class="str">&quot;pathPattern&quot;</span>: <span class="str">&quot;[parameters('referenceBlobName')]&quot;</span>
                                }
                            },
                            <span class="str">&quot;serialization&quot;</span>: {
                                <span class="str">&quot;type&quot;</span>: <span class="str">&quot;Json&quot;</span>,
                                <span class="str">&quot;properties&quot;</span>: {
                                    <span class="str">&quot;encoding&quot;</span>: <span class="str">&quot;UTF8&quot;</span>
                                }
                            }
                        }
                    }
                ],
                <span class="str">&quot;transformation&quot;</span>: {
                    <span class="str">&quot;name&quot;</span>: <span class="str">&quot;DeviceDemo&quot;</span>,
                    <span class="str">&quot;type&quot;</span>: <span class="str">&quot;Microsoft.StreamAnalytics/streamingjobs/transformations&quot;</span>,
                    <span class="str">&quot;properties&quot;</span>: {
                        <span class="str">&quot;streamingUnits&quot;</span>: 6,
                        <span class="str">&quot;query&quot;</span>: <span class="str">&quot;-- Find devices that it's at least 1 minute that don't send a message\r\nWITH\r\n<br />                                  OneEvent AS /* generate one event per period, any event */\r\n(\r\n                <br />                                  SELECT COUNT(*) As eventCount\r\n                FROM DeviceEvents TIMESTAMP BY <br />                                  DeviceEvents.[timestamp]\r\n                GROUP BY TumblingWindow(s, 60)\r\n),<br />                                  \r\nAllDevices AS /* generate one event per deviceId per period */\r\n(\r\n<br />                                                  SELECT ReferenceData.deviceId\r\n                <br />                                  FROM OneEvent JOIN ReferenceData\r\n                ON OneEvent.eventCount - <br />                                  OneEvent.eventCount = ReferenceData.deviceId - ReferenceData.deviceId\r\n),<br />                                  \r\nActualCounts AS /* compute how many events have been received in the time <br />                                  window from each device */\r\n(\r\n                SELECT deviceId,<br />                                  \r\n                       COUNT(*) AS eventCount\r\n                <br />                                  FROM DeviceEvents TIMESTAMP BY DeviceEvents.[timestamp]\r\n                <br />                                  GROUP BY TumblingWindow(s, 60), deviceId\r\n)\r\n/* left join AllDevices with <br />                                  ActualCounts to find devices with zero events */\r\nSELECT\r\n      <br />                                  AllDevices.deviceId,\r\n      CASE WHEN ActualCounts.eventCount IS NULL THEN 0<br />                                  \r\n           ELSE ActualCounts.eventCount\r\n      END AS eventCount,<br />                                  \r\n      System.Timestamp AS [timestamp]\r\nFROM\r\nAllDevices LEFT JOIN <br />                                  ActualCounts\r\nON\r\nActualCounts.deviceId = AllDevices.deviceId\r\nAND <br />                                  DATEDIFF(ms, ActualCounts, AllDevices) = 0\r\nWHERE ActualCounts.eventCount IS NULL&quot;</span>
                    }
                },
                <span class="str">&quot;outputs&quot;</span>: [
                    {
                        <span class="str">&quot;name&quot;</span>: <span class="str">&quot;Output&quot;</span>,
                        <span class="str">&quot;type&quot;</span>: <span class="str">&quot;Microsoft.StreamAnalytics/streamingjobs/outputs&quot;</span>,
                        <span class="str">&quot;properties&quot;</span>: {
                            <span class="str">&quot;datasource&quot;</span>: {
                                <span class="str">&quot;type&quot;</span>: <span class="str">&quot;Microsoft.ServiceBus/EventHub&quot;</span>,
                                <span class="str">&quot;properties&quot;</span>: {
                                    <span class="str">&quot;eventHubName&quot;</span>: <span class="str">&quot;[parameters('outputEventHubName')]&quot;</span>,
                                    <span class="str">&quot;partitionKey&quot;</span>: <span class="str">&quot;[parameters('outputEventHubPartitionKey')]&quot;</span>,
                                    <span class="str">&quot;serviceBusNamespace&quot;</span>: <span class="str">&quot;[parameters('outputServiceBusNamespace')]&quot;</span>,
                                    <span class="str">&quot;sharedAccessPolicyName&quot;</span>: <span class="str">&quot;[parameters('outputEventHubSharedAccessPolicyName')]&quot;</span>,
                                    <span class="str">&quot;sharedAccessPolicyKey&quot;</span>: <span class="str">&quot;[parameters('outputEventHubSharedAccessPolicyKey')]&quot;</span>
                                }
                            },
                            <span class="str">&quot;serialization&quot;</span>: {
                                <span class="str">&quot;type&quot;</span>: <span class="str">&quot;Json&quot;</span>,
                                <span class="str">&quot;properties&quot;</span>: {
                                    <span class="str">&quot;encoding&quot;</span>: <span class="str">&quot;UTF8&quot;</span>
                                }
                            }
                        }
                    }
                ]
            }
        }
    ]
}</pre>


<h4 align="justify">azuredeploy-parameters.json</h4>

<pre class="csharpcode">{
    <span class="str">&quot;jobName&quot;</span>: {
        <span class="str">&quot;value&quot;</span>: <span class="str">&quot;AbsenceOfSignal&quot;</span>
    },
    <span class="str">&quot;jobLocation&quot;</span>: {
        <span class="str">&quot;value&quot;</span>: <span class="str">&quot;&lt;job-location&gt;&quot;</span>
    },
     <span class="str">&quot;referenceStorageAccountName&quot;</span>: {
        <span class="str">&quot;value&quot;</span>: <span class="str">&quot;&lt;storage-account-name&gt;&quot;</span>
    },
    <span class="str">&quot;referenceStorageAccountKey&quot;</span>: {
        <span class="str">&quot;value&quot;</span>: <span class="str">&quot;&lt;storage-account-key&gt;&quot;</span>
    },
    <span class="str">&quot;referenceContainerName&quot;</span>: {
        <span class="str">&quot;value&quot;</span>: <span class="str">&quot;&lt;container-name&gt;&quot;</span>
    },
    <span class="str">&quot;referenceBlobName&quot;</span>: {
        <span class="str">&quot;value&quot;</span>: <span class="str">&quot;DeviceReferenceData.json&quot;</span>
    },
    <span class="str">&quot;inputServiceBusNamespace&quot;</span>: {
        <span class="str">&quot;value&quot;</span>: <span class="str">&quot;&lt;input-event-hub-servicebus-namespace&gt;&quot;</span>
    },
    <span class="str">&quot;inputEventHubName&quot;</span>: {
        <span class="str">&quot;value&quot;</span>: <span class="str">&quot;&lt;input-event-hub-name&gt;&quot;</span>
    },
    <span class="str">&quot;inputEventHubConsumerGroupName&quot;</span>: {
        <span class="str">&quot;value&quot;</span>: <span class="str">&quot;&lt;input-event-hub-consumergroup-name&gt;&quot;</span>
    },
    <span class="str">&quot;inputEventHubSharedAccessPolicyName&quot;</span>: {
        <span class="str">&quot;value&quot;</span>: <span class="str">&quot;&lt;input-event-hub-shared-access-policy-name&gt;&quot;</span>
    },
    <span class="str">&quot;inputEventHubSharedAccessPolicyKey&quot;</span>: {
        <span class="str">&quot;value&quot;</span>: <span class="str">&quot;&lt;input-event-hub-shared-access-policy-key&gt;&quot;</span>
    },
    <span class="str">&quot;outputServiceBusNamespace&quot;</span>: {
        <span class="str">&quot;value&quot;</span>: <span class="str">&quot;&lt;output-event-hub-servicebus-namespace&gt;&quot;</span>
    },
    <span class="str">&quot;outputEventHubName&quot;</span>: {
        <span class="str">&quot;value&quot;</span>: <span class="str">&quot;&lt;output-event-hub-name&gt;&quot;</span>
    },
    <span class="str">&quot;outputEventHubPartitionKey&quot;</span>: {
        <span class="str">&quot;value&quot;</span>: <span class="str">&quot;deviceId&quot;</span>
    },
    <span class="str">&quot;outputEventHubSharedAccessPolicyName&quot;</span>: {
        <span class="str">&quot;value&quot;</span>: <span class="str">&quot;&lt;output-event-hub-shared-access-policy-name&gt;&quot;</span>
    },
    <span class="str">&quot;outputEventHubSharedAccessPolicyKey&quot;</span>: {
        <span class="str">&quot;value&quot;</span>: <span class="str">&quot;&lt;output-event-hub-shared-access-policy-key&gt;&quot;</span>
    }
}</pre>


<p align="justify"><strong>Note</strong>: make sure that all the resources used by the solution are located in the same datacenter.</p>

<h1 align="justify">PowerShell Script</h1>

<p align="justify">Use the following PowerShell Script to create the Stream Analytics job.</p>

<div id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:ac4dcf2a-35e6-4e9c-9c98-30aa8e78ef67" class="wlWriterEditableSmartContent" style="margin: 0px; padding: 0px; float: none; display: inline;"><pre style="background-color:#FFFFFF;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;overflow: auto;"><span style="color: #008000;">#</span><span style="color: #008000;"> To login to Azure Resource Manager</span><span style="color: #008000;">
</span><span style="color: #000000;">Login</span><span style="color: #000000;">-</span><span style="color: #000000;">AzureRmAccount

</span><span style="color: #008000;">#</span><span style="color: #008000;"> Select a default subscription for your current session in case your account has multiple Azure subscriptions</span><span style="color: #008000;">
</span><span style="color: #000000;">Get</span><span style="color: #000000;">-</span><span style="color: #000000;">AzureRmSubscription –SubscriptionName “Paolo's Azure Account” </span><span style="color: #000000;">|</span><span style="color: #000000;"> Select</span><span style="color: #000000;">-</span><span style="color: #000000;">AzureRmSubscription

</span><span style="color: #008000;">#</span><span style="color: #008000;"> Initialize Variables</span><span style="color: #008000;">
</span><span style="color: #800080;">$resourceGroupName</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> 'StreamAnalyticsWestEuropeResourceGroup'
</span><span style="color: #800080;">$deploymentName</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> 'StreamAnalyticsIoTDemo'
</span><span style="color: #800080;">$location</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">West Europe</span><span style="color: #800000;">"</span><span style="color: #000000;">
</span><span style="color: #800080;">$templateFolderName</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> 'C:\Projects\Azure\StreamAnalytics\TestFiles\ARM\'
</span><span style="color: #800080;">$templateFile</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">$templateFolderName</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> 'azuredeploy.json'
</span><span style="color: #800080;">$templateParameterFile</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">$templateFolderName</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> 'azuredeploy</span><span style="color: #000000;">-</span><span style="color: #000000;">parameters.json'

</span><span style="color: #008000;">#</span><span style="color: #008000;"> Check if the resource group for the Stream Analytics job already exists</span><span style="color: #008000;">
</span><span style="color: #800080;">$resourceGroup</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> Get</span><span style="color: #000000;">-</span><span style="color: #000000;">AzureRmResourceGroup </span><span style="color: #000000;">-</span><span style="color: #000000;">Name </span><span style="color: #800080;">$resourceGroupName</span><span style="color: #000000;"> `
                                          </span><span style="color: #000000;">-</span><span style="color: #000000;">ErrorAction Ignore

</span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (</span><span style="color: #000000;">!</span><span style="color: #800080;">$resourceGroup</span><span style="color: #000000;">)
{
    </span><span style="color: #008000;">#</span><span style="color: #008000;"> Create the resource group if it does not exists</span><span style="color: #008000;">
</span><span style="color: #000000;">    Write</span><span style="color: #000000;">-</span><span style="color: #000000;">Host 'Creating' </span><span style="color: #800080;">$resourceGroupName</span><span style="color: #000000;"> 'resource group...'
    </span><span style="color: #800080;">$stopWatch</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> [Diagnostics.Stopwatch]</span><span style="color: #000000;">::</span><span style="color: #000000;">StartNew()
    New</span><span style="color: #000000;">-</span><span style="color: #000000;">AzureRmResourceGroup </span><span style="color: #000000;">-</span><span style="color: #000000;">Name </span><span style="color: #800080;">$resourceGroupName</span><span style="color: #000000;"> `
                             </span><span style="color: #000000;">-</span><span style="color: #000000;">Location </span><span style="color: #800080;">$location</span><span style="color: #000000;"> `
                             </span><span style="color: #000000;">-</span><span style="color: #000000;">ErrorAction Stop
    </span><span style="color: #800080;">$stopWatch</span><span style="color: #000000;">.Stop()
    Write</span><span style="color: #000000;">-</span><span style="color: #000000;">Host 'The resource group' </span><span style="color: #800080;">$resourceGroupName</span><span style="color: #000000;"> ' has been successfully created </span><span style="color: #0000FF;">in</span><span style="color: #000000;">' </span><span style="color: #800080;">$stopWatch</span><span style="color: #000000;">.Elapsed.TotalSeconds 'seconds'
}
</span><span style="color: #0000FF;">else</span><span style="color: #000000;">
{
    Write</span><span style="color: #000000;">-</span><span style="color: #000000;">Host 'The resource group' </span><span style="color: #800080;">$resourceGroupName</span><span style="color: #000000;"> 'already exists'
}

</span><span style="color: #008000;">#</span><span style="color: #008000;"> Check if a deployment with the specified name already exists</span><span style="color: #008000;">
</span><span style="color: #800080;">$deployment</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> Get</span><span style="color: #000000;">-</span><span style="color: #000000;">AzureRmResourceGroupDeployment </span><span style="color: #000000;">-</span><span style="color: #000000;">Name </span><span style="color: #800080;">$deploymentName</span><span style="color: #000000;"> `
                                                 </span><span style="color: #000000;">-</span><span style="color: #000000;">ResourceGroupName </span><span style="color: #800080;">$resourceGroupName</span><span style="color: #000000;">

</span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (</span><span style="color: #800080;">$deployment</span><span style="color: #000000;">)
{
    </span><span style="color: #008000;">#</span><span style="color: #008000;"> Delete the resource group if it already exists</span><span style="color: #008000;">
</span><span style="color: #000000;">    Write</span><span style="color: #000000;">-</span><span style="color: #000000;">Host 'The' </span><span style="color: #800080;">$deploymentName</span><span style="color: #000000;"> 'deployment already exists. Deleting the deployment...'
    </span><span style="color: #800080;">$stopWatch</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> [Diagnostics.Stopwatch]</span><span style="color: #000000;">::</span><span style="color: #000000;">StartNew()
    Remove</span><span style="color: #000000;">-</span><span style="color: #000000;">AzureRmResourceGroupDeployment </span><span style="color: #000000;">-</span><span style="color: #000000;">Name </span><span style="color: #800080;">$deploymentName</span><span style="color: #000000;"> `
                                          </span><span style="color: #000000;">-</span><span style="color: #000000;">ResourceGroupName </span><span style="color: #800080;">$resourceGroupName</span><span style="color: #000000;"> `
                                          </span><span style="color: #000000;">-</span><span style="color: #000000;">Force `
                                          </span><span style="color: #000000;">-</span><span style="color: #000000;">ErrorAction Stop
    </span><span style="color: #800080;">$stopWatch</span><span style="color: #000000;">.Stop()
    Write</span><span style="color: #000000;">-</span><span style="color: #000000;">Host 'The deployment' </span><span style="color: #800080;">$deploymentName</span><span style="color: #000000;"> ' has been successfully deleted </span><span style="color: #0000FF;">in</span><span style="color: #000000;"> ' </span><span style="color: #800080;">$stopWatch</span><span style="color: #000000;">.Elapsed.TotalSeconds 'seconds'
}

</span><span style="color: #008000;">#</span><span style="color: #008000;"> Create the resource group deployment</span><span style="color: #008000;">
</span><span style="color: #000000;">Write</span><span style="color: #000000;">-</span><span style="color: #000000;">Host 'Adding deployment' </span><span style="color: #800080;">$deploymentName</span><span style="color: #000000;"> 'to' </span><span style="color: #800080;">$resourceGroupName</span><span style="color: #000000;"> 'resource group...'
</span><span style="color: #800080;">$stopWatch</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> [Diagnostics.Stopwatch]</span><span style="color: #000000;">::</span><span style="color: #000000;">StartNew()
New</span><span style="color: #000000;">-</span><span style="color: #000000;">AzureRmResourceGroupDeployment </span><span style="color: #000000;">-</span><span style="color: #000000;">Name </span><span style="color: #800080;">$deploymentName</span><span style="color: #000000;"> `
                                   </span><span style="color: #000000;">-</span><span style="color: #000000;">ResourceGroupName </span><span style="color: #800080;">$resourceGroupName</span><span style="color: #000000;"> `
                                   </span><span style="color: #000000;">-</span><span style="color: #000000;">TemplateFile </span><span style="color: #800080;">$templateFile</span><span style="color: #000000;"> `
                                   </span><span style="color: #000000;">-</span><span style="color: #000000;">TemplateParameterFile </span><span style="color: #800080;">$templateParameterFile</span><span style="color: #000000;"> `
                                   </span><span style="color: #000000;">-</span><span style="color: #000000;">ErrorAction Stop
</span><span style="color: #800080;">$stopWatch</span><span style="color: #000000;">.Stop()
</span><span style="color: #800080;">$deployment</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> Get</span><span style="color: #000000;">-</span><span style="color: #000000;">AzureRmResourceGroupDeployment </span><span style="color: #000000;">-</span><span style="color: #000000;">ResourceGroupName </span><span style="color: #800080;">$resourceGroupName</span><span style="color: #000000;"> `
                                                 </span><span style="color: #000000;">-</span><span style="color: #000000;">Name </span><span style="color: #800080;">$deploymentName</span><span style="color: #000000;"> `
                                                 </span><span style="color: #000000;">-</span><span style="color: #000000;">ErrorAction Stop
Write</span><span style="color: #000000;">-</span><span style="color: #000000;">Host 'Operation Complete'
Write</span><span style="color: #000000;">-</span><span style="color: #000000;">Host '</span><span style="color: #000000;">==================</span><span style="color: #000000;">'
Write</span><span style="color: #000000;">-</span><span style="color: #000000;">Host 'Provisioning State :' </span><span style="color: #800080;">$deployment</span><span style="color: #000000;">[</span><span style="color: #000000;">0</span><span style="color: #000000;">].ProvisioningState
Write</span><span style="color: #000000;">-</span><span style="color: #000000;">Host 'Time elapsed :' </span><span style="color: #800080;">$stopWatch</span><span style="color: #000000;">.Elapsed.TotalSeconds 'seconds'</span></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --></div>]]></content:encoded>
    </item>
    <item>
      <title>How to implement a partitioned SendBatch method for Azure Service Bus entities</title>
      <link>https://docs.microsoft.com/archive/blogs/paolos/how-to-implement-a-partitioned-sendbatch-method-for-azure-service-bus-entities</link>
      <pubDate>Thu, 26 Mar 2015 06:53:36 GMT</pubDate>
      <dc:creator><![CDATA[Paolo Salvatori]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/paolos/2015/03/26/how-to-implement-a-partitioned-sendbatch-method-for-azure-service-bus-entities/</guid>
      <description><![CDATA[Introduction  When a developer tries to use the SendBatch or SendBatchAsync methods exposed by the...]]></description>
      <content:encoded><![CDATA[<h1>Introduction</h1>  <p style="text-align: justify;">When a developer tries to use the SendBatch or SendBatchAsync methods exposed by the <a href="https://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.messagesender.aspx?f=255&amp;MSPPError=-2147217396">MessageSender</a>, <a href="https://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.queueclient.aspx">QueueClient</a>, <a href="https://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.topicclient.aspx">TopicClient</a>, and <a href="https://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.eventhubclient.aspx">EventHubClient</a> classes contained in the <a href="https://msdn.microsoft.com/en-us/library/jj933424.aspx"> Microsoft.ServiceBus.dll</a>, and the batch size is greater than the maximum allowed size for a <a href="https://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.brokeredmessage.aspx">BrokeredMessage</a> or an <a href="https://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.eventdata.aspx">EventHub</a> object (at the time of writing, the limit is 256 KB), the method call throws a <a href="https://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.messagesizeexceededexception.aspx">MessageSizeExceededException</a>. This library contains synchronous and asynchronous extension methods for the <a href="https://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.messagesender.aspx?f=255&amp;MSPPError=-2147217396">MessageSender</a>, <a href="https://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.queueclient.aspx">QueueClient</a>,<a href="https://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.topicclient.aspx">TopicClient</a>, and <a href="https://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.eventhubclient.aspx">EventHubClient</a> classes that allow to send a batch which size is greater than the maximum allowed size for a batch. In particular, the implementation partitions the batch into one or multiple batches, each smaller than the maximum size allowed, and sends them in a loop, to respect the chronological order of the messages contained in the original batch. The code can be found <a href="http://bit.ly/1EHg2Qp">here</a>.</p>  <h1>GitHub</h1>  <p>The solution is also available on <a href="https://github.com/paolosalvatori/ServiceBusExtensions">GitHub</a>.</p>  <h1>Solution</h1>  <p style="text-align: left;">The <strong>ServiceBusExtensions </strong>library contains 4 classes:</p>  <ul>   <li><strong>MessageSenderExtensions</strong>: this class exposes the SendPartitionedBatch and SendPartitionedBatchAsync extension methods for the <a href="https://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.messagesender.aspx?f=255&amp;MSPPError=-2147217396">MessageSender</a> class. </li>    <li><strong>QueueClientExtensions</strong>: this class exposes the SendPartitionedBatch andSendPartitionedBatchAsync extension methods for the <a href="https://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.queueclient.aspx">QueueClient</a> class. </li>    <li><strong>TopicClientExtensions</strong>: this class exposes the SendPartitionedBatch andSendPartitionedBatchAsync extension methods for the <a href="https://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.topicclient.aspx">TopicClient</a> class. </li>    <li><strong>EventHubClientExtensions</strong>: this class exposes the SendPartitionedBatch andSendPartitionedBatchAsync extension methods for the <a href="https://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.eventhubclient.aspx">EventHubClient</a> class. </li> </ul>  <p>The <strong>TesterClient </strong>project contains a Console Application that can be used to test the library</p>  <h1>ServiceBusExtensions Library</h1>  <p>The following table contains the code of the QueueClientExtensions class. The code for the MessageSenderExtensions and TopicClientExtensions classes is very similar, so I will omit it for simplicity.</p>  <div class="scriptcode">   <div class="pluginEditHolder" plugincommand="mceScriptCode">     <div id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:2975d4fc-7f4f-44f4-b6e8-0e5ae7bce521" class="wlWriterEditableSmartContent" style="margin: 0px; padding: 0px; float: none; display: inline;"><pre style="background-color:#FFFFFF;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;overflow: auto;"><span style="color: #0000FF;">#region</span><span style="color: #000000;"> Using Directives</span><span style="color: #000000;">
</span><span style="color: #0000FF;">using</span><span style="color: #000000;"> System;
</span><span style="color: #0000FF;">using</span><span style="color: #000000;"> System.Collections.Generic;
</span><span style="color: #0000FF;">using</span><span style="color: #000000;"> System.Diagnostics;
</span><span style="color: #0000FF;">using</span><span style="color: #000000;"> System.Linq;
</span><span style="color: #0000FF;">using</span><span style="color: #000000;"> Microsoft.ServiceBus.Messaging;
</span><span style="color: #0000FF;">using</span><span style="color: #000000;"> System.Threading.Tasks;
</span><span style="color: #0000FF;">#endregion</span><span style="color: #000000;">

</span><span style="color: #0000FF;">namespace</span><span style="color: #000000;"> Microsoft.AzureCat.ServiceBusExtensions
{
  </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;summary&gt;</span><span style="color: #008000;">
  </span><span style="color: #808080;">///</span><span style="color: #008000;"> This class contains extensions methods for the QueueClient class
  </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;/summary&gt;</span><span style="color: #808080;">
</span><span style="color: #000000;">  </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">static</span><span style="color: #000000;"> </span><span style="color: #0000FF;">class</span><span style="color: #000000;"> QueueClientClientExtensions
  {
    </span><span style="color: #0000FF;">#region</span><span style="color: #000000;"> Private Constants</span><span style="color: #000000;">
    </span><span style="color: #008000;">//</span><span style="color: #008000;">*******************************
    </span><span style="color: #008000;">//</span><span style="color: #008000;"> Formats
    </span><span style="color: #008000;">//</span><span style="color: #008000;">*******************************</span><span style="color: #008000;">
</span><span style="color: #000000;">    </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> BrokeredMessageListCannotBeNullOrEmpty </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">The brokeredMessageEnumerable parameter cannot be null or empty.</span><span style="color: #800000;">"</span><span style="color: #000000;">;
    </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> SendPartitionedBatchFormat </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">[QueueClient.SendPartitionedBatch] Batch Sent: BatchSizeInBytes=[{0}] MessageCount=[{1}]</span><span style="color: #800000;">"</span><span style="color: #000000;">;
    </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> SendPartitionedBatchAsyncFormat </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">[QueueClient.SendPartitionedBatchAsync] Batch Sent: BatchSizeInBytes=[{0}] MessageCount=[{1}]</span><span style="color: #800000;">"</span><span style="color: #000000;">;
    </span><span style="color: #0000FF;">#endregion</span><span style="color: #000000;">

    </span><span style="color: #0000FF;">#region</span><span style="color: #000000;"> Public Methods</span><span style="color: #000000;">
    </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;summary&gt;</span><span style="color: #008000;">
    </span><span style="color: #808080;">///</span><span style="color: #008000;"> Sends a set of brokered messages (for batch processing). 
    </span><span style="color: #808080;">///</span><span style="color: #008000;"> If the batch size is greater than the maximum batch size, 
    </span><span style="color: #808080;">///</span><span style="color: #008000;"> the method partitions the original batch into multiple batches, 
    </span><span style="color: #808080;">///</span><span style="color: #008000;"> each smaller in size than the maximum batch size.
    </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;/summary&gt;</span><span style="color: #008000;">
    </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;param name="queueClient"&gt;</span><span style="color: #008000;">The current QueueClient object.</span><span style="color: #808080;">&lt;/param&gt;</span><span style="color: #008000;">
    </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;param name="brokeredMessageEnumerable"&gt;</span><span style="color: #008000;">The collection of brokered messages to send.</span><span style="color: #808080;">&lt;/param&gt;</span><span style="color: #008000;">
    </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;param name="trace"&gt;</span><span style="color: #008000;">true to cause a message to be written; otherwise, false.</span><span style="color: #808080;">&lt;/param&gt;</span><span style="color: #008000;">
    </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;returns&gt;</span><span style="color: #008000;">The asynchronous operation.</span><span style="color: #808080;">&lt;/returns&gt;</span><span style="color: #808080;">
</span><span style="color: #000000;">    </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> async </span><span style="color: #0000FF;">static</span><span style="color: #000000;"> Task SendPartitionedBatchAsync(</span><span style="color: #0000FF;">this</span><span style="color: #000000;"> QueueClient queueClient, IEnumerable</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">BrokeredMessage</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"> brokeredMessageEnumerable, </span><span style="color: #0000FF;">bool</span><span style="color: #000000;"> trace </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">false</span><span style="color: #000000;">)
    {
      var brokeredMessageList </span><span style="color: #000000;">=</span><span style="color: #000000;"> brokeredMessageEnumerable </span><span style="color: #0000FF;">as</span><span style="color: #000000;"> IList</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">BrokeredMessage</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"> </span><span style="color: #000000;">??</span><span style="color: #000000;"> brokeredMessageEnumerable.ToList();
      </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (brokeredMessageEnumerable </span><span style="color: #000000;">==</span><span style="color: #000000;"> </span><span style="color: #0000FF;">null</span><span style="color: #000000;"> </span><span style="color: #000000;">||</span><span style="color: #000000;"> </span><span style="color: #000000;">!</span><span style="color: #000000;">brokeredMessageList.Any())
      {
        </span><span style="color: #0000FF;">throw</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> ArgumentNullException(BrokeredMessageListCannotBeNullOrEmpty);
      }

      var batchList </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> List</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">BrokeredMessage</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">();
      </span><span style="color: #0000FF;">long</span><span style="color: #000000;"> batchSize </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">0</span><span style="color: #000000;">;

      </span><span style="color: #0000FF;">foreach</span><span style="color: #000000;"> (var brokeredMessage </span><span style="color: #0000FF;">in</span><span style="color: #000000;"> brokeredMessageList)
      {
        </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> ((batchSize </span><span style="color: #000000;">+</span><span style="color: #000000;"> brokeredMessage.Size) </span><span style="color: #000000;">&gt;</span><span style="color: #000000;"> Constants.MaxBathSizeInBytes)
        {
          </span><span style="color: #008000;">//</span><span style="color: #008000;"> Send current batch</span><span style="color: #008000;">
</span><span style="color: #000000;">          await queueClient.SendBatchAsync(batchList);
          Trace.WriteLineIf(trace, </span><span style="color: #0000FF;">string</span><span style="color: #000000;">.Format(SendPartitionedBatchAsyncFormat, batchSize, batchList.Count));

          </span><span style="color: #008000;">//</span><span style="color: #008000;"> Initialize a new batch</span><span style="color: #008000;">
</span><span style="color: #000000;">          batchList </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> List</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">BrokeredMessage</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"> { brokeredMessage };
          batchSize </span><span style="color: #000000;">=</span><span style="color: #000000;"> brokeredMessage.Size;
        }
        </span><span style="color: #0000FF;">else</span><span style="color: #000000;">
        {
          </span><span style="color: #008000;">//</span><span style="color: #008000;"> Add the BrokeredMessage to the current batch</span><span style="color: #008000;">
</span><span style="color: #000000;">          batchList.Add(brokeredMessage);
          batchSize </span><span style="color: #000000;">+=</span><span style="color: #000000;"> brokeredMessage.Size;
        }
      }
      </span><span style="color: #008000;">//</span><span style="color: #008000;"> The final batch is sent outside of the loop</span><span style="color: #008000;">
</span><span style="color: #000000;">      await queueClient.SendBatchAsync(batchList);
      Trace.WriteLineIf(trace, </span><span style="color: #0000FF;">string</span><span style="color: #000000;">.Format(SendPartitionedBatchAsyncFormat, batchSize, batchList.Count));
    }

    </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;summary&gt;</span><span style="color: #008000;">
    </span><span style="color: #808080;">///</span><span style="color: #008000;"> Sends a set of brokered messages (for batch processing). 
    </span><span style="color: #808080;">///</span><span style="color: #008000;"> If the batch size is greater than the maximum batch size, 
    </span><span style="color: #808080;">///</span><span style="color: #008000;"> the method partitions the original batch into multiple batches, 
    </span><span style="color: #808080;">///</span><span style="color: #008000;"> each smaller in size than the maximum batch size.
    </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;/summary&gt;</span><span style="color: #008000;">
    </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;param name="queueClient"&gt;</span><span style="color: #008000;">The current QueueClient object.</span><span style="color: #808080;">&lt;/param&gt;</span><span style="color: #008000;">
    </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;param name="brokeredMessageEnumerable"&gt;</span><span style="color: #008000;">The collection of brokered messages to send.</span><span style="color: #808080;">&lt;/param&gt;</span><span style="color: #008000;">
    </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;param name="trace"&gt;</span><span style="color: #008000;">true to cause a message to be written; otherwise, false.</span><span style="color: #808080;">&lt;/param&gt;</span><span style="color: #808080;">
</span><span style="color: #000000;">    </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">static</span><span style="color: #000000;"> </span><span style="color: #0000FF;">void</span><span style="color: #000000;"> SendPartitionedBatch(</span><span style="color: #0000FF;">this</span><span style="color: #000000;"> QueueClient queueClient, IEnumerable</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">BrokeredMessage</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"> brokeredMessageEnumerable, </span><span style="color: #0000FF;">bool</span><span style="color: #000000;"> trace </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">false</span><span style="color: #000000;">)
    {
      var brokeredMessageList </span><span style="color: #000000;">=</span><span style="color: #000000;"> brokeredMessageEnumerable </span><span style="color: #0000FF;">as</span><span style="color: #000000;"> IList</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">BrokeredMessage</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"> </span><span style="color: #000000;">??</span><span style="color: #000000;"> brokeredMessageEnumerable.ToList();
      </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (brokeredMessageEnumerable </span><span style="color: #000000;">==</span><span style="color: #000000;"> </span><span style="color: #0000FF;">null</span><span style="color: #000000;"> </span><span style="color: #000000;">||</span><span style="color: #000000;"> </span><span style="color: #000000;">!</span><span style="color: #000000;">brokeredMessageList.Any())
      {
        </span><span style="color: #0000FF;">throw</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> ArgumentNullException(BrokeredMessageListCannotBeNullOrEmpty);
      }

      var batchList </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> List</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">BrokeredMessage</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">();
      </span><span style="color: #0000FF;">long</span><span style="color: #000000;"> batchSize </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">0</span><span style="color: #000000;">;

      </span><span style="color: #0000FF;">foreach</span><span style="color: #000000;"> (var brokeredMessage </span><span style="color: #0000FF;">in</span><span style="color: #000000;"> brokeredMessageList)
      {
        </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> ((batchSize </span><span style="color: #000000;">+</span><span style="color: #000000;"> brokeredMessage.Size) </span><span style="color: #000000;">&gt;</span><span style="color: #000000;"> Constants.MaxBathSizeInBytes)
        {
          </span><span style="color: #008000;">//</span><span style="color: #008000;"> Send current batch</span><span style="color: #008000;">
</span><span style="color: #000000;">          queueClient.SendBatch(batchList);
          Trace.WriteLineIf(trace, </span><span style="color: #0000FF;">string</span><span style="color: #000000;">.Format(SendPartitionedBatchFormat, batchSize, batchList.Count));

          </span><span style="color: #008000;">//</span><span style="color: #008000;"> Initialize a new batch</span><span style="color: #008000;">
</span><span style="color: #000000;">          batchList </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> List</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">BrokeredMessage</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"> { brokeredMessage };
          batchSize </span><span style="color: #000000;">=</span><span style="color: #000000;"> brokeredMessage.Size;
        }
        </span><span style="color: #0000FF;">else</span><span style="color: #000000;">
        {
          </span><span style="color: #008000;">//</span><span style="color: #008000;"> Add the BrokeredMessage to the current batch</span><span style="color: #008000;">
</span><span style="color: #000000;">          batchList.Add(brokeredMessage);
          batchSize </span><span style="color: #000000;">+=</span><span style="color: #000000;"> brokeredMessage.Size;
        }
      }
      </span><span style="color: #008000;">//</span><span style="color: #008000;"> The final batch is sent outside of the loop</span><span style="color: #008000;">
</span><span style="color: #000000;">      queueClient.SendBatch(batchList);
      Trace.WriteLineIf(trace, </span><span style="color: #0000FF;">string</span><span style="color: #000000;">.Format(SendPartitionedBatchFormat, batchSize, batchList.Count));
    }
    </span><span style="color: #0000FF;">#endregion</span><span style="color: #000000;">
  }
}</span></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --></div>
  </div>
</div>

<p>The following table contains the code of the EventHubClientExtensions class. <strong> Note</strong>: all the event data sent in a batch using the <a href="https://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.eventhubclient.sendbatch.aspx">EventHubClient.SendBatch</a> or <a href="https://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.eventhubclient.sendbatchasync.aspx">EventHubClient.SendBatchAsync</a> methods need to have the same <a href="https://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.eventdata.partitionkey.aspx">PartitionKey</a>. In fact, when using one of these methods, all the event data contained in the batch are insersted in the same partition of the event hub by the Event Hub message broker.<span>&#160;</span>Hence, they need to share the same value in the PartitionKey property as the latter is used to determine to which partition to send event data.</p>

<div id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:9bbe6ad5-c782-4bc1-a445-0a98f43bb352" class="wlWriterEditableSmartContent" style="margin: 0px; padding: 0px; float: none; display: inline;"><pre style="background-color:#FFFFFF;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;overflow: auto;"><span style="color: #0000FF;">#region</span><span style="color: #000000;"> Copyright</span><span style="color: #000000;">
</span><span style="color: #008000;">//</span><span style="color: #008000;">=======================================================================================
</span><span style="color: #008000;">//</span><span style="color: #008000;"> Microsoft Azure Customer Advisory Team  
</span><span style="color: #008000;">//</span><span style="color: #008000;">
</span><span style="color: #008000;">//</span><span style="color: #008000;"> This sample is supplemental to the technical guidance published on the community
</span><span style="color: #008000;">//</span><span style="color: #008000;"> blog at </span><span style="color: #008000; text-decoration: underline;">http://blogs.msdn.com/b/paolos/.</span><span style="color: #008000;"> 
</span><span style="color: #008000;">//</span><span style="color: #008000;"> 
</span><span style="color: #008000;">//</span><span style="color: #008000;"> Author: Paolo Salvatori
</span><span style="color: #008000;">//</span><span style="color: #008000;">=======================================================================================
</span><span style="color: #008000;">//</span><span style="color: #008000;"> Copyright © 2015 Microsoft Corporation. All rights reserved.
</span><span style="color: #008000;">//</span><span style="color: #008000;"> 
</span><span style="color: #008000;">//</span><span style="color: #008000;"> THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER 
</span><span style="color: #008000;">//</span><span style="color: #008000;"> EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF 
</span><span style="color: #008000;">//</span><span style="color: #008000;"> MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. YOU BEAR THE RISK OF USING IT.
</span><span style="color: #008000;">//</span><span style="color: #008000;">=======================================================================================</span><span style="color: #008000;">
</span><span style="color: #0000FF;">#endregion</span><span style="color: #000000;">

</span><span style="color: #0000FF;">#region</span><span style="color: #000000;"> Using Directives</span><span style="color: #000000;">
</span><span style="color: #0000FF;">using</span><span style="color: #000000;"> System;
</span><span style="color: #0000FF;">using</span><span style="color: #000000;"> System.Collections.Generic;
</span><span style="color: #0000FF;">using</span><span style="color: #000000;"> System.Diagnostics;
</span><span style="color: #0000FF;">using</span><span style="color: #000000;"> System.Linq;
</span><span style="color: #0000FF;">using</span><span style="color: #000000;"> Microsoft.ServiceBus.Messaging; 
</span><span style="color: #0000FF;">using</span><span style="color: #000000;"> System.Threading.Tasks;
</span><span style="color: #0000FF;">#endregion</span><span style="color: #000000;">

</span><span style="color: #0000FF;">namespace</span><span style="color: #000000;"> Microsoft.AzureCat.ServiceBusExtensions
{
  </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;summary&gt;</span><span style="color: #008000;">
  </span><span style="color: #808080;">///</span><span style="color: #008000;"> This class contains extensions methods for the EventHubClient class
  </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;/summary&gt;</span><span style="color: #808080;">
</span><span style="color: #000000;">  </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">static</span><span style="color: #000000;"> </span><span style="color: #0000FF;">class</span><span style="color: #000000;"> EventHubClientExtensions
  {
    </span><span style="color: #0000FF;">#region</span><span style="color: #000000;"> Private Constants</span><span style="color: #000000;">
    </span><span style="color: #008000;">//</span><span style="color: #008000;">*******************************
    </span><span style="color: #008000;">//</span><span style="color: #008000;"> Formats
    </span><span style="color: #008000;">//</span><span style="color: #008000;">*******************************</span><span style="color: #008000;">
</span><span style="color: #000000;">    </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> EventDataListCannotBeNullOrEmpty </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">The eventDataEnumerable parameter cannot be null or empty.</span><span style="color: #800000;">"</span><span style="color: #000000;">;
    </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> SendPartitionedBatchFormat </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">[EventHubClient.SendPartitionedBatch] Batch Sent: BatchSizeInBytes=[{0}] MessageCount=[{1}]</span><span style="color: #800000;">"</span><span style="color: #000000;">;
    </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> SendPartitionedBatchAsyncFormat </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">[EventHubClient.SendPartitionedBatchAsync] Batch Sent: BatchSizeInBytes=[{0}] MessageCount=[{1}]</span><span style="color: #800000;">"</span><span style="color: #000000;">;
    </span><span style="color: #0000FF;">#endregion</span><span style="color: #000000;">

    </span><span style="color: #0000FF;">#region</span><span style="color: #000000;"> Public Methods</span><span style="color: #000000;">
    </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;summary&gt;</span><span style="color: #008000;">
    </span><span style="color: #808080;">///</span><span style="color: #008000;"> Asynchronously sends a batch of event data to the same partition.
    </span><span style="color: #808080;">///</span><span style="color: #008000;"> All the event data in the batch need to have the same value in the Partitionkey property.
    </span><span style="color: #808080;">///</span><span style="color: #008000;"> If the batch size is greater than the maximum batch size, 
    </span><span style="color: #808080;">///</span><span style="color: #008000;"> the method partitions the original batch into multiple batches, 
    </span><span style="color: #808080;">///</span><span style="color: #008000;"> each smaller in size than the maximum batch size.
    </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;/summary&gt;</span><span style="color: #008000;">
    </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;param name="eventHubClient"&gt;</span><span style="color: #008000;">The current EventHubClient object.</span><span style="color: #808080;">&lt;/param&gt;</span><span style="color: #008000;">
    </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;param name="eventDataEnumerable"&gt;</span><span style="color: #008000;">An IEnumerable object containing event data instances.</span><span style="color: #808080;">&lt;/param&gt;</span><span style="color: #008000;">
    </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;param name="trace"&gt;</span><span style="color: #008000;">true to cause a message to be written; otherwise, false.</span><span style="color: #808080;">&lt;/param&gt;</span><span style="color: #008000;">
    </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;returns&gt;</span><span style="color: #008000;">The asynchronous operation.</span><span style="color: #808080;">&lt;/returns&gt;</span><span style="color: #808080;">
</span><span style="color: #000000;">    </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> async </span><span style="color: #0000FF;">static</span><span style="color: #000000;"> Task SendPartitionedBatchAsync(</span><span style="color: #0000FF;">this</span><span style="color: #000000;"> EventHubClient eventHubClient, IEnumerable</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">EventData</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"> eventDataEnumerable, </span><span style="color: #0000FF;">bool</span><span style="color: #000000;"> trace </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">false</span><span style="color: #000000;">)
    {
      var eventDataList </span><span style="color: #000000;">=</span><span style="color: #000000;"> eventDataEnumerable </span><span style="color: #0000FF;">as</span><span style="color: #000000;"> IList</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">EventData</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"> </span><span style="color: #000000;">??</span><span style="color: #000000;"> eventDataEnumerable.ToList();
      </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (eventDataEnumerable </span><span style="color: #000000;">==</span><span style="color: #000000;"> </span><span style="color: #0000FF;">null</span><span style="color: #000000;"> </span><span style="color: #000000;">||</span><span style="color: #000000;"> </span><span style="color: #000000;">!</span><span style="color: #000000;">eventDataList.Any())
      {
        </span><span style="color: #0000FF;">throw</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> ArgumentNullException(EventDataListCannotBeNullOrEmpty);
      }

      var batchList </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> List</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">EventData</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">();
      </span><span style="color: #0000FF;">long</span><span style="color: #000000;"> batchSize </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">0</span><span style="color: #000000;">;

      </span><span style="color: #0000FF;">foreach</span><span style="color: #000000;"> (var eventData </span><span style="color: #0000FF;">in</span><span style="color: #000000;"> eventDataList)
      {
        </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> ((batchSize </span><span style="color: #000000;">+</span><span style="color: #000000;"> eventData.SerializedSizeInBytes) </span><span style="color: #000000;">&gt;</span><span style="color: #000000;"> Constants.MaxBathSizeInBytes)
        {
          </span><span style="color: #008000;">//</span><span style="color: #008000;"> Send current batch</span><span style="color: #008000;">
</span><span style="color: #000000;">          await eventHubClient.SendBatchAsync(batchList);
          Trace.WriteLineIf(trace, </span><span style="color: #0000FF;">string</span><span style="color: #000000;">.Format(SendPartitionedBatchAsyncFormat, batchSize, batchList.Count));

          </span><span style="color: #008000;">//</span><span style="color: #008000;"> Initialize a new batch</span><span style="color: #008000;">
</span><span style="color: #000000;">          batchList </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> List</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">EventData</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"> { eventData };
          batchSize </span><span style="color: #000000;">=</span><span style="color: #000000;"> eventData.SerializedSizeInBytes;
        }
        </span><span style="color: #0000FF;">else</span><span style="color: #000000;">
        {
          </span><span style="color: #008000;">//</span><span style="color: #008000;"> Add the EventData to the current batch</span><span style="color: #008000;">
</span><span style="color: #000000;">          batchList.Add(eventData);
          batchSize </span><span style="color: #000000;">+=</span><span style="color: #000000;"> eventData.SerializedSizeInBytes;
        }
      }
      </span><span style="color: #008000;">//</span><span style="color: #008000;"> The final batch is sent outside of the loop</span><span style="color: #008000;">
</span><span style="color: #000000;">      await eventHubClient.SendBatchAsync(batchList);
      Trace.WriteLineIf(trace, </span><span style="color: #0000FF;">string</span><span style="color: #000000;">.Format(SendPartitionedBatchAsyncFormat, batchSize, batchList.Count));
    }

    </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;summary&gt;</span><span style="color: #008000;">
    </span><span style="color: #808080;">///</span><span style="color: #008000;"> Asynchronously sends a batch of event data to the same partition.
    </span><span style="color: #808080;">///</span><span style="color: #008000;"> All the event data in the batch need to have the same value in the Partitionkey property.
    </span><span style="color: #808080;">///</span><span style="color: #008000;"> If the batch size is greater than the maximum batch size, 
    </span><span style="color: #808080;">///</span><span style="color: #008000;"> the method partitions the original batch into multiple batches, 
    </span><span style="color: #808080;">///</span><span style="color: #008000;"> each smaller in size than the maximum batch size.
    </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;/summary&gt;</span><span style="color: #008000;">
    </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;param name="eventHubClient"&gt;</span><span style="color: #008000;">The current EventHubClient object.</span><span style="color: #808080;">&lt;/param&gt;</span><span style="color: #008000;">
    </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;param name="eventDataEnumerable"&gt;</span><span style="color: #008000;">An IEnumerable object containing event data instances.</span><span style="color: #808080;">&lt;/param&gt;</span><span style="color: #008000;">
    </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;param name="trace"&gt;</span><span style="color: #008000;">true to cause a message to be written; otherwise, false.</span><span style="color: #808080;">&lt;/param&gt;</span><span style="color: #808080;">
</span><span style="color: #000000;">    </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">static</span><span style="color: #000000;"> </span><span style="color: #0000FF;">void</span><span style="color: #000000;"> SendPartitionedBatch(</span><span style="color: #0000FF;">this</span><span style="color: #000000;"> EventHubClient eventHubClient, IEnumerable</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">EventData</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"> eventDataEnumerable, </span><span style="color: #0000FF;">bool</span><span style="color: #000000;"> trace </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">false</span><span style="color: #000000;">)
    {
      var eventDataList </span><span style="color: #000000;">=</span><span style="color: #000000;"> eventDataEnumerable </span><span style="color: #0000FF;">as</span><span style="color: #000000;"> IList</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">EventData</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"> </span><span style="color: #000000;">??</span><span style="color: #000000;"> eventDataEnumerable.ToList();
      </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (eventDataEnumerable </span><span style="color: #000000;">==</span><span style="color: #000000;"> </span><span style="color: #0000FF;">null</span><span style="color: #000000;"> </span><span style="color: #000000;">||</span><span style="color: #000000;"> </span><span style="color: #000000;">!</span><span style="color: #000000;">eventDataList.Any())
      {
        </span><span style="color: #0000FF;">throw</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> ArgumentNullException(EventDataListCannotBeNullOrEmpty);
      }

      var batchList </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> List</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">EventData</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">();
      </span><span style="color: #0000FF;">long</span><span style="color: #000000;"> batchSize </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">0</span><span style="color: #000000;">;

      </span><span style="color: #0000FF;">foreach</span><span style="color: #000000;"> (var eventData </span><span style="color: #0000FF;">in</span><span style="color: #000000;"> eventDataList)
      {
        </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> ((batchSize </span><span style="color: #000000;">+</span><span style="color: #000000;"> eventData.SerializedSizeInBytes) </span><span style="color: #000000;">&gt;</span><span style="color: #000000;"> Constants.MaxBathSizeInBytes)
        {
          </span><span style="color: #008000;">//</span><span style="color: #008000;"> Send current batch</span><span style="color: #008000;">
</span><span style="color: #000000;">          eventHubClient.SendBatch(batchList);
          Trace.WriteLineIf(trace, </span><span style="color: #0000FF;">string</span><span style="color: #000000;">.Format(SendPartitionedBatchFormat, batchSize, batchList.Count));

          </span><span style="color: #008000;">//</span><span style="color: #008000;"> Initialize a new batch</span><span style="color: #008000;">
</span><span style="color: #000000;">          batchList </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> List</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">EventData</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"> { eventData };
          batchSize </span><span style="color: #000000;">=</span><span style="color: #000000;"> eventData.SerializedSizeInBytes;
        }
        </span><span style="color: #0000FF;">else</span><span style="color: #000000;">
        {
          </span><span style="color: #008000;">//</span><span style="color: #008000;"> Add the EventData to the current batch</span><span style="color: #008000;">
</span><span style="color: #000000;">          batchList.Add(eventData);
          batchSize </span><span style="color: #000000;">+=</span><span style="color: #000000;"> eventData.SerializedSizeInBytes;
        }
      }
      </span><span style="color: #008000;">//</span><span style="color: #008000;"> The final batch is sent outside of the loop</span><span style="color: #008000;">
</span><span style="color: #000000;">      eventHubClient.SendBatch(batchList);
      Trace.WriteLineIf(trace, </span><span style="color: #0000FF;">string</span><span style="color: #000000;">.Format(SendPartitionedBatchFormat, batchSize, batchList.Count));
    } 
    </span><span style="color: #0000FF;">#endregion</span><span style="color: #000000;">
  }
}</span></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --></div>

<h1>
  <div class="scriptcode">
    <div class="pluginEditHolder" plugincommand="mceScriptCode">
      <p>TestClient</p>
    </div>
  </div>
</h1>

<p>The following picture shows the <strong>TestClient </strong>console application that can be used to test each extension method defined by the <strong>ServiceBusExtensions </strong>library.</p>

<p align="center"><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/08/22/metablogapi/7357.TestClient_4C8BFB15.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-08-22-metablogapi/7357.TestClient_5F00_4C8BFB15.png"><img title="TestClient" style="display: inline; background-image: none;" border="0" alt="TestClient" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/08/22/metablogapi/8484.TestClient_thumb_2D6DFF97.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-08-22-metablogapi/8484.TestClient_5F00_thumb_5F00_2D6DFF97.png" width="804" height="424" /></a></p>

<p>In the <strong>appSettings </strong>section of the configuration file you can define the following settings:</p>

<ul>
  <li><strong>connectionString</strong>: the Service Bus namespace connectionstring. </li>

  <li><strong>messageSizeInBytes</strong>: the size of individual BrokeredMessage and EventData messages. </li>

  <li><strong>messageCountInBatch</strong>: the number of messages in a batch. </li>
</ul>

<p>Upon start, the client application creates the following entities in the target Service Bus namespace, if they don't already exist.</p>

<ul>
  <li><strong>batchtestqueue</strong>: this this is the queue used to test the extensions method contained in the QueueClientExtensions and MessageSenderExtensions classes. </li>

  <li><strong>batchtesttopic</strong>: this is the topic used to test the extensions method contained in the TopicClientExtensions class. </li>

  <li><strong>batcheventhub</strong>: this is the event hub used to test the extensions method contained in the EventHubClientExtensions class </li>
</ul>

<p>Then, the user can use the menu shown by the application to select one of the tests. Each test tries to use the original SendBatchAsync method exposed by each of the <a href="https://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.messagesender.aspx?f=255&amp;MSPPError=-2147217396">essageSender</a><span>, </span><a href="https://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.queueclient.aspx">QueueClient</a><span>,</span><a href="https://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.topicclient.aspx">TopicClient</a><span>, and </span><a href="https://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.eventhubclient.aspx">EventHubClient</a> classes. If the batch size is greater than the maximum allowed size, the method call will throw a <a href="https://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.messagesizeexceededexception.aspx">MessageSizeExceededException</a><span>. The SendPartitionedBatchAsync method instead will split the original batch into one or multiple batches, each smaller than the maximum allowed size, and will send them in the proper order to the target entity.</span></p>

<p><span>For your convenience, the following tables includes the code of the <strong>TestClient </strong>console application.</span></p>

<div class="scriptcode">
  <div id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:9a98a3a0-1552-4a3f-900a-c048165887af" class="wlWriterEditableSmartContent" style="margin: 0px; padding: 0px; float: none; display: inline;"><pre style="background-color:#FFFFFF;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;overflow: auto;"><span style="color: #0000FF;">#region</span><span style="color: #000000;"> Using Directives</span><span style="color: #000000;">
</span><span style="color: #0000FF;">using</span><span style="color: #000000;"> System;
</span><span style="color: #0000FF;">using</span><span style="color: #000000;"> System.Collections.Generic;
</span><span style="color: #0000FF;">using</span><span style="color: #000000;"> System.Configuration;
</span><span style="color: #0000FF;">using</span><span style="color: #000000;"> System.Diagnostics;
</span><span style="color: #0000FF;">using</span><span style="color: #000000;"> System.Globalization;
</span><span style="color: #0000FF;">using</span><span style="color: #000000;"> System.IO;
</span><span style="color: #0000FF;">using</span><span style="color: #000000;"> System.Runtime.CompilerServices;
</span><span style="color: #0000FF;">using</span><span style="color: #000000;"> System.Text;
</span><span style="color: #0000FF;">using</span><span style="color: #000000;"> System.Threading.Tasks;
</span><span style="color: #0000FF;">using</span><span style="color: #000000;"> Microsoft.ServiceBus;
</span><span style="color: #0000FF;">using</span><span style="color: #000000;"> Microsoft.ServiceBus.Messaging;

</span><span style="color: #0000FF;">#endregion</span><span style="color: #000000;">

</span><span style="color: #0000FF;">namespace</span><span style="color: #000000;"> Microsoft.AzureCat.ServiceBusExtensions.TestClient
{
  </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;summary&gt;</span><span style="color: #008000;">
  </span><span style="color: #808080;">///</span><span style="color: #008000;"> This class can be used to test the extensions methods defines in the ServiceBusExtensions library.
  </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;/summary&gt;</span><span style="color: #808080;">
</span><span style="color: #000000;">  </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">class</span><span style="color: #000000;"> Program
  {
    </span><span style="color: #0000FF;">#region</span><span style="color: #000000;"> Private Constants</span><span style="color: #000000;">
    </span><span style="color: #008000;">//</span><span style="color: #008000;">***************************
    </span><span style="color: #008000;">//</span><span style="color: #008000;"> Configuration Parameters
    </span><span style="color: #008000;">//</span><span style="color: #008000;">***************************</span><span style="color: #008000;">
</span><span style="color: #000000;">    </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> ConnectionString </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">connectionString</span><span style="color: #800000;">"</span><span style="color: #000000;">;
    </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> MessageSizeInBytes </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">messageSizeInBytes</span><span style="color: #800000;">"</span><span style="color: #000000;">;
    </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> MessageCountInBatch </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">messageCountInBatch</span><span style="color: #800000;">"</span><span style="color: #000000;">;

    </span><span style="color: #008000;">//</span><span style="color: #008000;">***************************
    </span><span style="color: #008000;">//</span><span style="color: #008000;"> Entities
    </span><span style="color: #008000;">//</span><span style="color: #008000;">***************************</span><span style="color: #008000;">
</span><span style="color: #000000;">    </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> QueueName </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">batchtestqueue</span><span style="color: #800000;">"</span><span style="color: #000000;">;
    </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> TopicName </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">batchtesttopic</span><span style="color: #800000;">"</span><span style="color: #000000;">;
    </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> SubscriptionName </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">auditing</span><span style="color: #800000;">"</span><span style="color: #000000;">;
    </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> EventHubName </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">batchtesteventhub</span><span style="color: #800000;">"</span><span style="color: #000000;">;

    </span><span style="color: #008000;">//</span><span style="color: #008000;">***************************
    </span><span style="color: #008000;">//</span><span style="color: #008000;"> Default Values
    </span><span style="color: #008000;">//</span><span style="color: #008000;">***************************</span><span style="color: #008000;">
</span><span style="color: #000000;">    </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">int</span><span style="color: #000000;"> DefaultMessageCountInBatch </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">100</span><span style="color: #000000;">;
    </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">int</span><span style="color: #000000;"> DefaultMessageSizeInBytes </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">16384</span><span style="color: #000000;">;

    </span><span style="color: #008000;">//</span><span style="color: #008000;">***************************
    </span><span style="color: #008000;">//</span><span style="color: #008000;"> Formats
    </span><span style="color: #008000;">//</span><span style="color: #008000;">***************************</span><span style="color: #008000;">
</span><span style="color: #000000;">    </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> ParameterFormat </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">{0}: [{1}]</span><span style="color: #800000;">"</span><span style="color: #000000;">;
    </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> PressKeyToExit </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">Press a key to exit.</span><span style="color: #800000;">"</span><span style="color: #000000;">;
    </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> MenuChoiceFormat </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">Select a numeric key between 1 and {0}</span><span style="color: #800000;">"</span><span style="color: #000000;">;
    </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> ConnectionStringCannotBeNull </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">The Service Bus connection string has not been defined in the configuration file.</span><span style="color: #800000;">"</span><span style="color: #000000;">;
    </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> QueueCreatedFormat </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">Queue [{0}] successfully created.</span><span style="color: #800000;">"</span><span style="color: #000000;">;
    </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> TopicCreatedFormat </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">Topic [{0}] successfully created.</span><span style="color: #800000;">"</span><span style="color: #000000;">;
    </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> SubscriptionCreatedFormat </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">Subscription [{0}] successfully created.</span><span style="color: #800000;">"</span><span style="color: #000000;">;
    </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> EventHubCreatedFormat </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">Event Hub [{0}] successfully created.</span><span style="color: #800000;">"</span><span style="color: #000000;">;
    </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> QueueAlreadyExistsFormat </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">Queue [{0}] already exists.</span><span style="color: #800000;">"</span><span style="color: #000000;">;
    </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> TopicAlreadyExistsFormat </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">Topic [{0}] already exists.</span><span style="color: #800000;">"</span><span style="color: #000000;">;
    </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> SubscriptionAlreadyExistsFormat </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">Subscription [{0}] already exists.</span><span style="color: #800000;">"</span><span style="color: #000000;">;
    </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> EventHubAlreadyExistsFormat </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">Event Hub [{0}] already exists.</span><span style="color: #800000;">"</span><span style="color: #000000;">;
    </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> CallingMessageSenderSendBatchAsync </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">Calling MessageSender.SendBatchAsync...</span><span style="color: #800000;">"</span><span style="color: #000000;">;
    </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> MessageSenderSendBatchAsyncCalled </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">MessageSender.SendBatchAsync called.</span><span style="color: #800000;">"</span><span style="color: #000000;">;
    </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> CallingMessageSenderSendPartitionedBatchAsync </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">Calling MessageSender.SendPartitionedBatchAsync...</span><span style="color: #800000;">"</span><span style="color: #000000;">;
    </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> MessageSenderSendPartitionedBatchAsyncCalled </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">MessageSender.SendPartitionedBatchAsync called.</span><span style="color: #800000;">"</span><span style="color: #000000;">;
    </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> CallingQueueClientSendBatchAsync </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">Calling QueueClient.SendBatchAsync...</span><span style="color: #800000;">"</span><span style="color: #000000;">;
    </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> QueueClientSendBatchAsyncCalled </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">QueueClient.SendBatchAsync called.</span><span style="color: #800000;">"</span><span style="color: #000000;">;
    </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> CallingQueueClientSendPartitionedBatchAsync </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">Calling QueueClient.SendPartitionedBatchAsync...</span><span style="color: #800000;">"</span><span style="color: #000000;">;
    </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> QueueClientSendPartitionedBatchAsyncCalled </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">QueueClient.SendPartitionedBatchAsync called.</span><span style="color: #800000;">"</span><span style="color: #000000;">;
    </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> CallingTopicClientSendBatchAsync </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">Calling TopicClient.SendBatchAsync...</span><span style="color: #800000;">"</span><span style="color: #000000;">;
    </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> TopicClientSendBatchAsyncCalled </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">TopicClient.SendBatchAsync called.</span><span style="color: #800000;">"</span><span style="color: #000000;">;
    </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> CallingTopicClientSendPartitionedBatchAsync </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">Calling TopicClient.SendPartitionedBatchAsync...</span><span style="color: #800000;">"</span><span style="color: #000000;">;
    </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> TopicClientSendPartitionedBatchAsyncCalled </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">TopicClient.SendPartitionedBatchAsync called.</span><span style="color: #800000;">"</span><span style="color: #000000;">;
    </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> CallingEventHubClientSendBatchAsync </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">Calling EventHubClient.SendBatchAsync...</span><span style="color: #800000;">"</span><span style="color: #000000;">;
    </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> EventHubClientSendBatchAsyncCalled </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">EventHubClient.SendBatchAsync called.</span><span style="color: #800000;">"</span><span style="color: #000000;">;
    </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> CallingEventHubClientSendPartitionedBatchAsync </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">Calling EventHubClient.SendPartitionedBatchAsync...</span><span style="color: #800000;">"</span><span style="color: #000000;">;
    </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> EventHubClientSendPartitionedBatchAsyncCalled </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">EventHubClient.SendPartitionedBatchAsync called.</span><span style="color: #800000;">"</span><span style="color: #000000;">;

    </span><span style="color: #008000;">//</span><span style="color: #008000;">***************************
    </span><span style="color: #008000;">//</span><span style="color: #008000;"> Menu Items
    </span><span style="color: #008000;">//</span><span style="color: #008000;">***************************</span><span style="color: #008000;">
</span><span style="color: #000000;">    </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> MessageSenderSendPartitionedBatchAsyncTest </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">MessageSender.SendPartitionedBatchAsync Test</span><span style="color: #800000;">"</span><span style="color: #000000;">;
    </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> QueueClientSendPartitionedBatchAsyncTest </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">QueueClient.SendPartitionedBatchAsync Test</span><span style="color: #800000;">"</span><span style="color: #000000;">;
    </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> TopicClientSendPartitionedBatchAsyncTest </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">TopicClient.SendPartitionedBatchAsync Test</span><span style="color: #800000;">"</span><span style="color: #000000;">;
    </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> EventHubClientSendPartitionedBatchAsyncTest </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">EventHubClient.SendPartitionedBatchAsync Test</span><span style="color: #800000;">"</span><span style="color: #000000;">;
    </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> Exit </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">Exit</span><span style="color: #800000;">"</span><span style="color: #000000;">;
    </span><span style="color: #0000FF;">#endregion</span><span style="color: #000000;">

    </span><span style="color: #0000FF;">#region</span><span style="color: #000000;"> Private Static Fields</span><span style="color: #000000;">
    </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">static</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> connectionString;
    </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">static</span><span style="color: #000000;"> </span><span style="color: #0000FF;">int</span><span style="color: #000000;"> messageSizeInBytes;
    </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">static</span><span style="color: #000000;"> </span><span style="color: #0000FF;">int</span><span style="color: #000000;"> messageCountInBatch;
    </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">static</span><span style="color: #000000;"> MessagingFactory messagingFactory;
    </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">static</span><span style="color: #000000;"> </span><span style="color: #0000FF;">readonly</span><span style="color: #000000;"> List</span><span style="color: #000000;">&lt;</span><span style="color: #0000FF;">string</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"> menuItemList </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> List</span><span style="color: #000000;">&lt;</span><span style="color: #0000FF;">string</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">
    {
      MessageSenderSendPartitionedBatchAsyncTest ,
      QueueClientSendPartitionedBatchAsyncTest,
      TopicClientSendPartitionedBatchAsyncTest,
      EventHubClientSendPartitionedBatchAsyncTest,
      Exit
    }; 
    </span><span style="color: #0000FF;">#endregion</span><span style="color: #000000;">

    </span><span style="color: #0000FF;">#region</span><span style="color: #000000;"> Main Method</span><span style="color: #000000;">
    </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">static</span><span style="color: #000000;"> </span><span style="color: #0000FF;">void</span><span style="color: #000000;"> Main()
    {
      </span><span style="color: #0000FF;">try</span><span style="color: #000000;">
      {
        </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (ReadConfiguration() </span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;"> CreateEntitiesAsync().Result)
        {
          </span><span style="color: #008000;">//</span><span style="color: #008000;"> Add ConsoleTraceListener</span><span style="color: #008000;">
</span><span style="color: #000000;">          Trace.Listeners.Add(</span><span style="color: #0000FF;">new</span><span style="color: #000000;"> ConsoleTraceListener());

          </span><span style="color: #008000;">//</span><span style="color: #008000;"> Create MessagingFactory object</span><span style="color: #008000;">
</span><span style="color: #000000;">          messagingFactory </span><span style="color: #000000;">=</span><span style="color: #000000;"> MessagingFactory.CreateFromConnectionString(connectionString);

          </span><span style="color: #0000FF;">int</span><span style="color: #000000;"> key;
          </span><span style="color: #0000FF;">while</span><span style="color: #000000;"> ((key </span><span style="color: #000000;">=</span><span style="color: #000000;"> ShowMenu()) </span><span style="color: #000000;">!=</span><span style="color: #000000;"> menuItemList.Count </span><span style="color: #000000;">-</span><span style="color: #000000;"> </span><span style="color: #800080;">1</span><span style="color: #000000;">)
          {
            </span><span style="color: #0000FF;">switch</span><span style="color: #000000;"> (menuItemList[key])
            {
              </span><span style="color: #0000FF;">case</span><span style="color: #000000;"> MessageSenderSendPartitionedBatchAsyncTest:
                </span><span style="color: #008000;">//</span><span style="color: #008000;"> Test MessageSender.SendPartitionedBatchAsync method</span><span style="color: #008000;">
</span><span style="color: #000000;">                MessageSenderTest().Wait();
                </span><span style="color: #0000FF;">break</span><span style="color: #000000;">;
              </span><span style="color: #0000FF;">case</span><span style="color: #000000;"> QueueClientSendPartitionedBatchAsyncTest:
                </span><span style="color: #008000;">//</span><span style="color: #008000;"> Test QueueClient.SendPartitionedBatchAsync method</span><span style="color: #008000;">
</span><span style="color: #000000;">                QueueClientTest().Wait();
                </span><span style="color: #0000FF;">break</span><span style="color: #000000;">;
              </span><span style="color: #0000FF;">case</span><span style="color: #000000;"> TopicClientSendPartitionedBatchAsyncTest:
                </span><span style="color: #008000;">//</span><span style="color: #008000;"> Test TopicClient.SendPartitionedBatchAsync method</span><span style="color: #008000;">
</span><span style="color: #000000;">                TopicClientTest().Wait();
                </span><span style="color: #0000FF;">break</span><span style="color: #000000;">;
              </span><span style="color: #0000FF;">case</span><span style="color: #000000;"> EventHubClientSendPartitionedBatchAsyncTest:
                </span><span style="color: #008000;">//</span><span style="color: #008000;"> Test EventHubClient.SendPartitionedBatchAsync method</span><span style="color: #008000;">
</span><span style="color: #000000;">                EventHubClientTest().Wait();
                </span><span style="color: #0000FF;">break</span><span style="color: #000000;">;
              </span><span style="color: #0000FF;">case</span><span style="color: #000000;"> Exit:
                </span><span style="color: #0000FF;">break</span><span style="color: #000000;">;
            }
          }
        }
      }
      </span><span style="color: #0000FF;">catch</span><span style="color: #000000;"> (Exception ex)
      {
        PrintException(ex);
      }
      PrintMessage(PressKeyToExit);
      Console.ReadLine();
    } 
    </span><span style="color: #0000FF;">#endregion</span><span style="color: #000000;">

    </span><span style="color: #0000FF;">#region</span><span style="color: #000000;"> Private Static Methods</span><span style="color: #000000;">
    </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> async </span><span style="color: #0000FF;">static</span><span style="color: #000000;"> Task MessageSenderTest()
    {
      </span><span style="color: #008000;">//</span><span style="color: #008000;"> Create MessageSender object</span><span style="color: #008000;">
</span><span style="color: #000000;">      var messageSender </span><span style="color: #000000;">=</span><span style="color: #000000;"> await messagingFactory.CreateMessageSenderAsync(QueueName);

      </span><span style="color: #008000;">//</span><span style="color: #008000;"> Test MessageSender.SendBatchAsync: if the batch size is greater than the max batch size
      </span><span style="color: #008000;">//</span><span style="color: #008000;"> the method throws a  MessageSizeExceededException</span><span style="color: #008000;">
</span><span style="color: #000000;">      </span><span style="color: #0000FF;">try</span><span style="color: #000000;">
      {
        PrintMessage(CallingMessageSenderSendBatchAsync);
        await messageSender.SendBatchAsync(CreateBrokeredMessageBatch());
        PrintMessage(MessageSenderSendBatchAsyncCalled);
      }
      </span><span style="color: #0000FF;">catch</span><span style="color: #000000;"> (Exception ex)
      {
        PrintException(ex);
      }

      </span><span style="color: #0000FF;">try</span><span style="color: #000000;">
      {
        </span><span style="color: #008000;">//</span><span style="color: #008000;"> Send the batch using the SendPartitionedBatchAsync method</span><span style="color: #008000;">
</span><span style="color: #000000;">        PrintMessage(CallingMessageSenderSendPartitionedBatchAsync);
        await messageSender.SendPartitionedBatchAsync(CreateBrokeredMessageBatch(), </span><span style="color: #0000FF;">true</span><span style="color: #000000;">);
        PrintMessage(MessageSenderSendPartitionedBatchAsyncCalled);
      }
      </span><span style="color: #0000FF;">catch</span><span style="color: #000000;"> (Exception ex)
      {
        PrintException(ex);
      }
    }

    </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> async </span><span style="color: #0000FF;">static</span><span style="color: #000000;"> Task QueueClientTest()
    {
      </span><span style="color: #008000;">//</span><span style="color: #008000;"> Create QueueClient object</span><span style="color: #008000;">
</span><span style="color: #000000;">      var queueClient </span><span style="color: #000000;">=</span><span style="color: #000000;"> messagingFactory.CreateQueueClient(QueueName);

      </span><span style="color: #008000;">//</span><span style="color: #008000;"> Test QueueClient.SendBatchAsync: if the batch size is greater than the max batch size
      </span><span style="color: #008000;">//</span><span style="color: #008000;"> the method throws a  MessageSizeExceededException</span><span style="color: #008000;">
</span><span style="color: #000000;">      </span><span style="color: #0000FF;">try</span><span style="color: #000000;">
      {
        PrintMessage(CallingQueueClientSendBatchAsync);
        await queueClient.SendBatchAsync(CreateBrokeredMessageBatch());
        PrintMessage(QueueClientSendBatchAsyncCalled);
      }
      </span><span style="color: #0000FF;">catch</span><span style="color: #000000;"> (Exception ex)
      {
        PrintException(ex);
      }

      </span><span style="color: #0000FF;">try</span><span style="color: #000000;">
      {
        </span><span style="color: #008000;">//</span><span style="color: #008000;"> Send the batch using the SendPartitionedBatchAsync method</span><span style="color: #008000;">
</span><span style="color: #000000;">        PrintMessage(CallingQueueClientSendPartitionedBatchAsync);
        await queueClient.SendPartitionedBatchAsync(CreateBrokeredMessageBatch(), </span><span style="color: #0000FF;">true</span><span style="color: #000000;">);
        PrintMessage(QueueClientSendPartitionedBatchAsyncCalled);
      }
      </span><span style="color: #0000FF;">catch</span><span style="color: #000000;"> (Exception ex)
      {
        PrintException(ex);
      }
    }

    </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> async </span><span style="color: #0000FF;">static</span><span style="color: #000000;"> Task TopicClientTest()
    {
      </span><span style="color: #008000;">//</span><span style="color: #008000;"> Create TopicClient object</span><span style="color: #008000;">
</span><span style="color: #000000;">      var topicClient </span><span style="color: #000000;">=</span><span style="color: #000000;"> messagingFactory.CreateTopicClient(TopicName);

      </span><span style="color: #008000;">//</span><span style="color: #008000;"> Test TopicClient.SendBatchAsync: if the batch size is greater than the max batch size
      </span><span style="color: #008000;">//</span><span style="color: #008000;"> the method throws a  MessageSizeExceededException</span><span style="color: #008000;">
</span><span style="color: #000000;">      </span><span style="color: #0000FF;">try</span><span style="color: #000000;">
      {
        PrintMessage(CallingTopicClientSendBatchAsync);
        await topicClient.SendBatchAsync(CreateBrokeredMessageBatch());
        PrintMessage(TopicClientSendBatchAsyncCalled);
      }
      </span><span style="color: #0000FF;">catch</span><span style="color: #000000;"> (Exception ex)
      {
        PrintException(ex);
      }

      </span><span style="color: #0000FF;">try</span><span style="color: #000000;">
      {
        </span><span style="color: #008000;">//</span><span style="color: #008000;"> Send the batch using the SendPartitionedBatchAsync method</span><span style="color: #008000;">
</span><span style="color: #000000;">        PrintMessage(CallingTopicClientSendPartitionedBatchAsync);
        await topicClient.SendPartitionedBatchAsync(CreateBrokeredMessageBatch(), </span><span style="color: #0000FF;">true</span><span style="color: #000000;">);
        PrintMessage(TopicClientSendPartitionedBatchAsyncCalled);
      }
      </span><span style="color: #0000FF;">catch</span><span style="color: #000000;"> (Exception ex)
      {
        PrintException(ex);
      }
    }

    </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> async </span><span style="color: #0000FF;">static</span><span style="color: #000000;"> Task EventHubClientTest()
    {
      </span><span style="color: #008000;">//</span><span style="color: #008000;"> Create EventHubClient object</span><span style="color: #008000;">
</span><span style="color: #000000;">      var eventHubClient </span><span style="color: #000000;">=</span><span style="color: #000000;"> EventHubClient.CreateFromConnectionString(connectionString, EventHubName);

      </span><span style="color: #008000;">//</span><span style="color: #008000;"> Test EventHubClient.SendBatchAsync: if the batch size is greater than the max batch size
      </span><span style="color: #008000;">//</span><span style="color: #008000;"> the method throws a  MessageSizeExceededException</span><span style="color: #008000;">
</span><span style="color: #000000;">      </span><span style="color: #0000FF;">try</span><span style="color: #000000;">
      {
        PrintMessage(CallingEventHubClientSendBatchAsync);
        await eventHubClient.SendBatchAsync(CreateEventDataBatch());
        PrintMessage(EventHubClientSendBatchAsyncCalled);
      }
      </span><span style="color: #0000FF;">catch</span><span style="color: #000000;"> (Exception ex)
      {
        PrintException(ex);
      }

      </span><span style="color: #0000FF;">try</span><span style="color: #000000;">
      {
        </span><span style="color: #008000;">//</span><span style="color: #008000;"> Send the batch using the SendPartitionedBatchAsync method</span><span style="color: #008000;">
</span><span style="color: #000000;">        PrintMessage(CallingEventHubClientSendPartitionedBatchAsync);
        await eventHubClient.SendPartitionedBatchAsync(CreateEventDataBatch(), </span><span style="color: #0000FF;">true</span><span style="color: #000000;">);
        PrintMessage(EventHubClientSendPartitionedBatchAsyncCalled);
      }
      </span><span style="color: #0000FF;">catch</span><span style="color: #000000;"> (Exception ex)
      {
        PrintException(ex);
      }
    }

    </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">static</span><span style="color: #000000;"> IEnumerable</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">BrokeredMessage</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"> CreateBrokeredMessageBatch()
    {
      var messageList </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> List</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">BrokeredMessage</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">();
      </span><span style="color: #0000FF;">for</span><span style="color: #000000;"> (var i </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">0</span><span style="color: #000000;">; i </span><span style="color: #000000;">&lt;</span><span style="color: #000000;"> messageCountInBatch; i</span><span style="color: #000000;">++</span><span style="color: #000000;">)
      {
        messageList.Add(</span><span style="color: #0000FF;">new</span><span style="color: #000000;"> BrokeredMessage(Encoding.UTF8.GetBytes(</span><span style="color: #0000FF;">new</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;">(</span><span style="color: #800000;">'</span><span style="color: #800000;">A</span><span style="color: #800000;">'</span><span style="color: #000000;">, messageSizeInBytes))));
      }
      </span><span style="color: #0000FF;">return</span><span style="color: #000000;"> messageList;
    }

    </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">static</span><span style="color: #000000;"> IEnumerable</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">EventData</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"> CreateEventDataBatch()
    {
      var messageList </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> List</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">EventData</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">();
      </span><span style="color: #0000FF;">for</span><span style="color: #000000;"> (var i </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">0</span><span style="color: #000000;">; i </span><span style="color: #000000;">&lt;</span><span style="color: #000000;"> messageCountInBatch; i</span><span style="color: #000000;">++</span><span style="color: #000000;">)
      {
        </span><span style="color: #008000;">//</span><span style="color: #008000;"> Note: the partition key in this sample is null.
        </span><span style="color: #008000;">//</span><span style="color: #008000;"> it's mandatory that all event data in a batch have the same PartitionKey</span><span style="color: #008000;">
</span><span style="color: #000000;">        messageList.Add(</span><span style="color: #0000FF;">new</span><span style="color: #000000;"> EventData(Encoding.UTF8.GetBytes(</span><span style="color: #0000FF;">new</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;">(</span><span style="color: #800000;">'</span><span style="color: #800000;">A</span><span style="color: #800000;">'</span><span style="color: #000000;">, messageSizeInBytes))));
      }
      </span><span style="color: #0000FF;">return</span><span style="color: #000000;"> messageList;
    }

    </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> async </span><span style="color: #0000FF;">static</span><span style="color: #000000;"> Task</span><span style="color: #000000;">&lt;</span><span style="color: #0000FF;">bool</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"> CreateEntitiesAsync()
    {
      </span><span style="color: #0000FF;">try</span><span style="color: #000000;">
      {
        </span><span style="color: #008000;">//</span><span style="color: #008000;"> Create NamespaceManeger object</span><span style="color: #008000;">
</span><span style="color: #000000;">        var namespaceManager </span><span style="color: #000000;">=</span><span style="color: #000000;"> NamespaceManager.CreateFromConnectionString(connectionString);
        
        </span><span style="color: #008000;">//</span><span style="color: #008000;"> Create test queue</span><span style="color: #008000;">
</span><span style="color: #000000;">        </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (</span><span style="color: #000000;">!</span><span style="color: #000000;">await namespaceManager.QueueExistsAsync(QueueName))
        {
          await namespaceManager.CreateQueueAsync(</span><span style="color: #0000FF;">new</span><span style="color: #000000;"> QueueDescription(QueueName)
          {
            EnableBatchedOperations </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">true</span><span style="color: #000000;">,
            EnableExpress </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">true</span><span style="color: #000000;">,
            EnablePartitioning </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">true</span><span style="color: #000000;">,
            EnableDeadLetteringOnMessageExpiration </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">true</span><span style="color: #000000;">
          });
          PrintMessage(</span><span style="color: #0000FF;">string</span><span style="color: #000000;">.Format(QueueCreatedFormat, QueueName));
        }
        </span><span style="color: #0000FF;">else</span><span style="color: #000000;">
        {
          PrintMessage(</span><span style="color: #0000FF;">string</span><span style="color: #000000;">.Format(QueueAlreadyExistsFormat, QueueName));
        }
        
        </span><span style="color: #008000;">//</span><span style="color: #008000;"> Create test topic</span><span style="color: #008000;">
</span><span style="color: #000000;">        </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (</span><span style="color: #000000;">!</span><span style="color: #000000;">await namespaceManager.TopicExistsAsync(TopicName))
        {
          await namespaceManager.CreateTopicAsync(</span><span style="color: #0000FF;">new</span><span style="color: #000000;"> TopicDescription(TopicName)
          {
            EnableBatchedOperations </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">true</span><span style="color: #000000;">,
            EnableExpress </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">true</span><span style="color: #000000;">,
            EnablePartitioning </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">true</span><span style="color: #000000;">,
          });
          PrintMessage(</span><span style="color: #0000FF;">string</span><span style="color: #000000;">.Format(TopicCreatedFormat, TopicName));
        }
        </span><span style="color: #0000FF;">else</span><span style="color: #000000;">
        {
          PrintMessage(</span><span style="color: #0000FF;">string</span><span style="color: #000000;">.Format(TopicAlreadyExistsFormat, TopicName));
        }
        
        </span><span style="color: #008000;">//</span><span style="color: #008000;"> Create test subscription</span><span style="color: #008000;">
</span><span style="color: #000000;">        </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (</span><span style="color: #000000;">!</span><span style="color: #000000;">await namespaceManager.SubscriptionExistsAsync(TopicName, SubscriptionName))
        {
          await namespaceManager.CreateSubscriptionAsync(</span><span style="color: #0000FF;">new</span><span style="color: #000000;"> SubscriptionDescription(TopicName, SubscriptionName)
          {
            EnableBatchedOperations </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">true</span><span style="color: #000000;">
          }, </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> RuleDescription(</span><span style="color: #0000FF;">new</span><span style="color: #000000;"> TrueFilter()));
          PrintMessage(</span><span style="color: #0000FF;">string</span><span style="color: #000000;">.Format(SubscriptionCreatedFormat, SubscriptionName));
        }
        </span><span style="color: #0000FF;">else</span><span style="color: #000000;">
        {
          PrintMessage(</span><span style="color: #0000FF;">string</span><span style="color: #000000;">.Format(SubscriptionAlreadyExistsFormat, SubscriptionName));
        }

        </span><span style="color: #008000;">//</span><span style="color: #008000;"> Create test event hub</span><span style="color: #008000;">
</span><span style="color: #000000;">        </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (</span><span style="color: #000000;">!</span><span style="color: #000000;">await namespaceManager.EventHubExistsAsync(EventHubName))
        {
          await namespaceManager.CreateEventHubAsync(</span><span style="color: #0000FF;">new</span><span style="color: #000000;"> EventHubDescription(EventHubName)
          {
            PartitionCount </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">16</span><span style="color: #000000;">,
            MessageRetentionInDays </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">1</span><span style="color: #000000;">
          });
          PrintMessage(</span><span style="color: #0000FF;">string</span><span style="color: #000000;">.Format(EventHubCreatedFormat, EventHubName));
        }
        </span><span style="color: #0000FF;">else</span><span style="color: #000000;">
        {
          PrintMessage(</span><span style="color: #0000FF;">string</span><span style="color: #000000;">.Format(EventHubAlreadyExistsFormat, EventHubName));
        }
      }
      </span><span style="color: #0000FF;">catch</span><span style="color: #000000;"> (Exception ex)
      {
        PrintException(ex);
        </span><span style="color: #0000FF;">return</span><span style="color: #000000;"> </span><span style="color: #0000FF;">false</span><span style="color: #000000;">;
      }
      </span><span style="color: #0000FF;">return</span><span style="color: #000000;"> </span><span style="color: #0000FF;">true</span><span style="color: #000000;">;
    }

    </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">static</span><span style="color: #000000;"> </span><span style="color: #0000FF;">int</span><span style="color: #000000;"> ShowMenu()
    {
      </span><span style="color: #008000;">//</span><span style="color: #008000;"> Print Menu Header</span><span style="color: #008000;">
</span><span style="color: #000000;">      Console.ForegroundColor </span><span style="color: #000000;">=</span><span style="color: #000000;"> ConsoleColor.Green;
      Console.Write(</span><span style="color: #800000;">"</span><span style="color: #800000;">[</span><span style="color: #800000;">"</span><span style="color: #000000;">);
      Console.ForegroundColor </span><span style="color: #000000;">=</span><span style="color: #000000;"> ConsoleColor.Yellow;
      Console.Write(</span><span style="color: #800000;">"</span><span style="color: #800000;">Menu</span><span style="color: #800000;">"</span><span style="color: #000000;">);
      Console.ForegroundColor </span><span style="color: #000000;">=</span><span style="color: #000000;"> ConsoleColor.Green;
      Console.WriteLine(</span><span style="color: #800000;">"</span><span style="color: #800000;">]</span><span style="color: #800000;">"</span><span style="color: #000000;">);
      Console.ResetColor();

      </span><span style="color: #008000;">//</span><span style="color: #008000;"> Print Menu Items</span><span style="color: #008000;">
</span><span style="color: #000000;">      </span><span style="color: #0000FF;">for</span><span style="color: #000000;"> (var i </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">0</span><span style="color: #000000;">; i </span><span style="color: #000000;">&lt;</span><span style="color: #000000;"> menuItemList.Count; i</span><span style="color: #000000;">++</span><span style="color: #000000;">)
      {
        Console.ForegroundColor </span><span style="color: #000000;">=</span><span style="color: #000000;"> ConsoleColor.Green;
        Console.Write(</span><span style="color: #800000;">"</span><span style="color: #800000;">[</span><span style="color: #800000;">"</span><span style="color: #000000;">);
        Console.ForegroundColor </span><span style="color: #000000;">=</span><span style="color: #000000;"> ConsoleColor.Yellow;
        Console.Write(</span><span style="color: #800000;">"</span><span style="color: #800000;">{0}</span><span style="color: #800000;">"</span><span style="color: #000000;">, i </span><span style="color: #000000;">+</span><span style="color: #000000;"> </span><span style="color: #800080;">1</span><span style="color: #000000;">);
        Console.ForegroundColor </span><span style="color: #000000;">=</span><span style="color: #000000;"> ConsoleColor.Green;
        Console.Write(</span><span style="color: #800000;">"</span><span style="color: #800000;">]</span><span style="color: #800000;">"</span><span style="color: #000000;">);
        Console.ResetColor();
        Console.Write(</span><span style="color: #800000;">"</span><span style="color: #800000;">: </span><span style="color: #800000;">"</span><span style="color: #000000;">);
        Console.WriteLine(menuItemList[i]);
        Console.ResetColor();
      }

      </span><span style="color: #008000;">//</span><span style="color: #008000;"> Select an option</span><span style="color: #008000;">
</span><span style="color: #000000;">      Console.ForegroundColor </span><span style="color: #000000;">=</span><span style="color: #000000;"> ConsoleColor.Green;
      Console.Write(</span><span style="color: #800000;">"</span><span style="color: #800000;">[</span><span style="color: #800000;">"</span><span style="color: #000000;">);
      Console.ForegroundColor </span><span style="color: #000000;">=</span><span style="color: #000000;"> ConsoleColor.Yellow;
      Console.Write(MenuChoiceFormat, menuItemList.Count);
      Console.ForegroundColor </span><span style="color: #000000;">=</span><span style="color: #000000;"> ConsoleColor.Green;
      Console.Write(</span><span style="color: #800000;">"</span><span style="color: #800000;">]</span><span style="color: #800000;">"</span><span style="color: #000000;">);
      Console.ResetColor();
      Console.Write(</span><span style="color: #800000;">"</span><span style="color: #800000;">: </span><span style="color: #800000;">"</span><span style="color: #000000;">);

      var key </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">'</span><span style="color: #800000;">a</span><span style="color: #800000;">'</span><span style="color: #000000;">;
      </span><span style="color: #0000FF;">while</span><span style="color: #000000;"> (key </span><span style="color: #000000;">&lt;</span><span style="color: #000000;"> </span><span style="color: #800000;">'</span><span style="color: #800000;">1</span><span style="color: #800000;">'</span><span style="color: #000000;"> </span><span style="color: #000000;">||</span><span style="color: #000000;"> key </span><span style="color: #000000;">&gt;</span><span style="color: #000000;"> </span><span style="color: #800000;">'</span><span style="color: #800000;">9</span><span style="color: #800000;">'</span><span style="color: #000000;">)
      {
        key </span><span style="color: #000000;">=</span><span style="color: #000000;"> Console.ReadKey(</span><span style="color: #0000FF;">true</span><span style="color: #000000;">).KeyChar;
      }
      Console.WriteLine();
      </span><span style="color: #0000FF;">return</span><span style="color: #000000;"> key </span><span style="color: #000000;">-</span><span style="color: #000000;"> </span><span style="color: #800000;">'</span><span style="color: #800000;">1</span><span style="color: #800000;">'</span><span style="color: #000000;">;
    }

    </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">static</span><span style="color: #000000;"> </span><span style="color: #0000FF;">bool</span><span style="color: #000000;"> ReadConfiguration()
    {
      </span><span style="color: #0000FF;">try</span><span style="color: #000000;">
      {
        </span><span style="color: #008000;">//</span><span style="color: #008000;"> Set window size</span><span style="color: #008000;">
</span><span style="color: #000000;">        Console.SetWindowSize(</span><span style="color: #800080;">120</span><span style="color: #000000;">, </span><span style="color: #800080;">40</span><span style="color: #000000;">);

        </span><span style="color: #008000;">//</span><span style="color: #008000;"> Read connectionString setting</span><span style="color: #008000;">
</span><span style="color: #000000;">        connectionString </span><span style="color: #000000;">=</span><span style="color: #000000;"> ConfigurationManager.AppSettings[ConnectionString];
        </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (</span><span style="color: #0000FF;">string</span><span style="color: #000000;">.IsNullOrWhiteSpace(connectionString))
        {
          </span><span style="color: #0000FF;">throw</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> ArgumentException(ConnectionStringCannotBeNull);
        }
        PrintMessage(</span><span style="color: #0000FF;">string</span><span style="color: #000000;">.Format(ParameterFormat, ConnectionString, connectionString));

        </span><span style="color: #008000;">//</span><span style="color: #008000;"> Read messageSizeInBytes setting</span><span style="color: #008000;">
</span><span style="color: #000000;">        </span><span style="color: #0000FF;">int</span><span style="color: #000000;"> value;
        var setting </span><span style="color: #000000;">=</span><span style="color: #000000;"> ConfigurationManager.AppSettings[MessageSizeInBytes];
        messageSizeInBytes </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">int</span><span style="color: #000000;">.TryParse(setting, </span><span style="color: #0000FF;">out</span><span style="color: #000000;"> value) </span><span style="color: #000000;">?</span><span style="color: #000000;">
                value :
                DefaultMessageSizeInBytes;
        PrintMessage(</span><span style="color: #0000FF;">string</span><span style="color: #000000;">.Format(ParameterFormat, MessageSizeInBytes, messageSizeInBytes));

        </span><span style="color: #008000;">//</span><span style="color: #008000;"> Read messageCountInBatch setting</span><span style="color: #008000;">
</span><span style="color: #000000;">        setting </span><span style="color: #000000;">=</span><span style="color: #000000;"> ConfigurationManager.AppSettings[MessageCountInBatch];
        messageCountInBatch </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">int</span><span style="color: #000000;">.TryParse(setting, </span><span style="color: #0000FF;">out</span><span style="color: #000000;"> value) </span><span style="color: #000000;">?</span><span style="color: #000000;">
                value :
                DefaultMessageCountInBatch;
        PrintMessage(</span><span style="color: #0000FF;">string</span><span style="color: #000000;">.Format(ParameterFormat, MessageCountInBatch, messageCountInBatch));
        </span><span style="color: #0000FF;">return</span><span style="color: #000000;"> </span><span style="color: #0000FF;">true</span><span style="color: #000000;">;
      }
      </span><span style="color: #0000FF;">catch</span><span style="color: #000000;"> (Exception ex)
      {
        PrintException(ex);
      }
      </span><span style="color: #0000FF;">return</span><span style="color: #000000;"> </span><span style="color: #0000FF;">false</span><span style="color: #000000;">;
    }

    </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">static</span><span style="color: #000000;"> </span><span style="color: #0000FF;">void</span><span style="color: #000000;"> PrintMessage(</span><span style="color: #0000FF;">string</span><span style="color: #000000;"> message, [CallerMemberName] </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> memberName </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">""</span><span style="color: #000000;">)
    {
      </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (</span><span style="color: #0000FF;">string</span><span style="color: #000000;">.IsNullOrWhiteSpace(message) </span><span style="color: #000000;">||</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;">.IsNullOrWhiteSpace(memberName))
      {
        </span><span style="color: #0000FF;">return</span><span style="color: #000000;">;
      }
      Console.ForegroundColor </span><span style="color: #000000;">=</span><span style="color: #000000;"> ConsoleColor.Green;
      Console.Write(</span><span style="color: #800000;">"</span><span style="color: #800000;">[</span><span style="color: #800000;">"</span><span style="color: #000000;">);
      Console.ForegroundColor </span><span style="color: #000000;">=</span><span style="color: #000000;"> ConsoleColor.Yellow;
      Console.Write(memberName);
      Console.ForegroundColor </span><span style="color: #000000;">=</span><span style="color: #000000;"> ConsoleColor.Green;
      Console.Write(</span><span style="color: #800000;">"</span><span style="color: #800000;">]</span><span style="color: #800000;">"</span><span style="color: #000000;">);
      Console.ResetColor();
      Console.Write(</span><span style="color: #800000;">"</span><span style="color: #800000;">: </span><span style="color: #800000;">"</span><span style="color: #000000;">);
      Console.WriteLine(message);
    }

    </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">static</span><span style="color: #000000;"> </span><span style="color: #0000FF;">void</span><span style="color: #000000;"> PrintException(Exception ex,
                       [CallerFilePath] </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> sourceFilePath </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">""</span><span style="color: #000000;">,
                       [CallerMemberName] </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> memberName </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">""</span><span style="color: #000000;">,
                       [CallerLineNumber] </span><span style="color: #0000FF;">int</span><span style="color: #000000;"> sourceLineNumber </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">0</span><span style="color: #000000;">)
    {
      Console.ForegroundColor </span><span style="color: #000000;">=</span><span style="color: #000000;"> ConsoleColor.Green;
      Console.Write(</span><span style="color: #800000;">"</span><span style="color: #800000;">[</span><span style="color: #800000;">"</span><span style="color: #000000;">);
      Console.ForegroundColor </span><span style="color: #000000;">=</span><span style="color: #000000;"> ConsoleColor.Yellow;
      </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> fileName </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">null</span><span style="color: #000000;">;
      </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (File.Exists(sourceFilePath))
      {
        var file </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> FileInfo(sourceFilePath);
        fileName </span><span style="color: #000000;">=</span><span style="color: #000000;"> file.Name;
      }
      Console.Write(</span><span style="color: #0000FF;">string</span><span style="color: #000000;">.IsNullOrWhiteSpace(fileName) </span><span style="color: #000000;">?</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">Unknown</span><span style="color: #800000;">"</span><span style="color: #000000;"> : fileName);
      Console.ForegroundColor </span><span style="color: #000000;">=</span><span style="color: #000000;"> ConsoleColor.Green;
      Console.Write(</span><span style="color: #800000;">"</span><span style="color: #800000;">:</span><span style="color: #800000;">"</span><span style="color: #000000;">);
      Console.ForegroundColor </span><span style="color: #000000;">=</span><span style="color: #000000;"> ConsoleColor.Yellow;
      Console.Write(</span><span style="color: #0000FF;">string</span><span style="color: #000000;">.IsNullOrWhiteSpace(memberName) </span><span style="color: #000000;">?</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">Unknown</span><span style="color: #800000;">"</span><span style="color: #000000;"> : memberName);
      Console.ForegroundColor </span><span style="color: #000000;">=</span><span style="color: #000000;"> ConsoleColor.Green;
      Console.Write(</span><span style="color: #800000;">"</span><span style="color: #800000;">:</span><span style="color: #800000;">"</span><span style="color: #000000;">);
      Console.ForegroundColor </span><span style="color: #000000;">=</span><span style="color: #000000;"> ConsoleColor.Yellow;
      Console.Write(sourceLineNumber.ToString(CultureInfo.InvariantCulture));
      Console.ForegroundColor </span><span style="color: #000000;">=</span><span style="color: #000000;"> ConsoleColor.Green;
      Console.Write(</span><span style="color: #800000;">"</span><span style="color: #800000;">]</span><span style="color: #800000;">"</span><span style="color: #000000;">);
      Console.ResetColor();
      Console.Write(</span><span style="color: #800000;">"</span><span style="color: #800000;">: </span><span style="color: #800000;">"</span><span style="color: #000000;">);
      Console.WriteLine(ex </span><span style="color: #000000;">!=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">null</span><span style="color: #000000;"> </span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;"> </span><span style="color: #000000;">!</span><span style="color: #0000FF;">string</span><span style="color: #000000;">.IsNullOrWhiteSpace(ex.Message) </span><span style="color: #000000;">?</span><span style="color: #000000;"> ex.Message : </span><span style="color: #800000;">"</span><span style="color: #800000;">An error occurred.</span><span style="color: #800000;">"</span><span style="color: #000000;">);
      var aggregateException </span><span style="color: #000000;">=</span><span style="color: #000000;"> ex </span><span style="color: #0000FF;">as</span><span style="color: #000000;"> AggregateException;
      </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (aggregateException </span><span style="color: #000000;">==</span><span style="color: #000000;"> </span><span style="color: #0000FF;">null</span><span style="color: #000000;">)
      {
        </span><span style="color: #0000FF;">return</span><span style="color: #000000;">;
      }
      </span><span style="color: #0000FF;">foreach</span><span style="color: #000000;"> (var exception </span><span style="color: #0000FF;">in</span><span style="color: #000000;"> aggregateException.InnerExceptions)
      {
        PrintException(exception);
      }
    }
    </span><span style="color: #0000FF;">#endregion</span><span style="color: #000000;">
  }
}</span></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --></div>
</div>]]></content:encoded>
    </item>
    <item>
      <title>How to store Event Hub events to Azure SQL Database</title>
      <link>https://docs.microsoft.com/archive/blogs/paolos/how-to-store-event-hub-events-to-azure-sql-database</link>
      <pubDate>Thu, 05 Mar 2015 01:49:59 GMT</pubDate>
      <dc:creator><![CDATA[Paolo Salvatori]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/paolos/2015/03/05/how-to-store-event-hub-events-to-azure-sql-database/</guid>
      <description><![CDATA[Introduction  This sample shows how to use the EventProcessorHost to retrieve events from an Event...]]></description>
      <content:encoded><![CDATA[<h1>Introduction</h1>  <p>This sample shows how to use the EventProcessorHost to retrieve events from an Event Hub and store them in a batch mode to an Azure SQL Database. The solution demonstrates how the use the following techniques:</p>  <ul>   <li>Send events to an <a href="https://msdn.microsoft.com/en-us/library/azure/dn789973.aspx">Event Hub</a> using both AMQP and HTTPS transport protocols. </li>    <li>Create an entity level shared access policy with only the Send claim. This key will be used to create SAS tokens, one for each publisher endpoint.&#160; </li>    <li>Issue a SAS token to secure individual publisher endpoints. </li>    <li>Use a SAS token to authenticate at a publisher endpoint level. </li>    <li>Use the <a href="https://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.eventprocessorhost(v=azure.95).aspx">EventProcessorHost</a> to retrieve and process events from an event hub. </li>    <li>Perform structured and sematic logging using a custom <a href="https://msdn.microsoft.com/en-us/library/system.diagnostics.tracing.eventsource%28v=vs.110%29.aspx?f=255&amp;MSPPError=-2147217396">EventSource</a> class and ETW Logs introduced by Azure SDK 2.5. </li>    <li>Use a stored procedure with a <a href="https://msdn.microsoft.com/en-us/library/bb675163%28v=vs.110%29.aspx?f=255&amp;MSPPError=-2147217396">Table-Valued Parameter</a> to store multiple events in a batch mode to a table on an Azure SQL database. </li> </ul>  <p>You can download the code from <a href="https://code.msdn.microsoft.com/How-to-integrate-store-828769eb">MSDN Code Gallery</a>.</p>  <h1>Scenario</h1>  <p>This solution simulates an Internet of Things (IoT) scenario where thousands of devices send events (e.g. sensor readings) to a backend system via a message broker. The backend system retrieves events from the messaging infrastrcure and store them to a persistent repository in a scalable manner. </p>  <h1><span>Architecture</span></h1>  <p><span>The sample is structured as follows:</span></p>  <ul>   <li>A Windows Forms application can be used to create an event hub and an entity level shared access policy with only the Send access right.&#160; </li>    <li>The same application can be used to simulate a configurable amount of devices that send readings into the event hub. Each device uses a separate publisher endpoint to send data to the underlying event hub and a separate SAS token to authenticate with the Service Bus namespace. </li>    <li>An event hub is used to ingest device events. </li>    <li>A worker role with multiple instances uses an <a href="https://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.eventprocessorhost(v=azure.95).aspx">EventProcessorHost</a> to read and process messages from the partitions of the event hub. </li>    <li>The custom <a href="https://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.ieventprocessor.aspx">EventProcessor</a> class uses a <a href="https://msdn.microsoft.com/en-us/library/bb675163%28v=vs.110%29.aspx?f=255&amp;MSPPError=-2147217396">Table-Valued Parameter</a> to insert events into a table of a SQL Database in a batch mode by invoking a stored procedure. </li>    <li>The worker role uses a custom <a href="https://msdn.microsoft.com/en-us/library/system.diagnostics.tracing.eventsource%28v=vs.110%29.aspx?f=255&amp;MSPPError=-2147217396">EventSource</a>class and the ETW log support introduced by the Azure SDK 2.5 to write log data to table storage. </li>    <li>The stored procedure uses the <a href="https://msdn.microsoft.com/en-us/library/bb510625.aspx"> MERGE</a> statement to implement an UPSERT mechanism. </li> </ul>  <p>The following picture shows the architecture of the solution:</p>  <p><img id="134594" style="margin-right: auto; margin-left: auto; float: none; display: block;" alt="" src="https://i1.code.msdn.s-msft.com/how-to-integrate-store-828769eb/image/file/134594/1/prototype.png" width="800" /></p>  <p>&#160;</p>  <h1>References</h1>  <p>Event Hubs</p>  <ul>   <li><a href="http://azure.microsoft.com/en-us/services/event-hubs/">Event Hubs</a> </li>    <li><a href="http://azure.microsoft.com/en-us/documentation/articles/service-bus-event-hubs-csharp-ephcs-getstarted/">Get started with Event Hubs</a> </li>    <li><a href="https://msdn.microsoft.com/en-us/library/azure/dn789972.aspx">Event Hubs Programming Guide</a> </li>    <li><a href="https://code.msdn.microsoft.com/windowsazure/Service-Bus-Event-Hub-286fd097">Service Bus Event Hubs Getting Started</a> </li>    <li><a href="https://msdn.microsoft.com/en-us/library/azure/dn789974.aspx">Event Hubs Authentication and Security Model Overview</a> </li>    <li><a href="https://code.msdn.microsoft.com/windowsazure/Service-Bus-Event-Hub-99ce67ab">Service Bus Event Hubs Large Scale Secure Publishing</a> </li>    <li><a href="https://code.msdn.microsoft.com/windowsazure/Event-Hub-Direct-Receivers-13fa95c6">Service Bus Event Hubs Direct Receivers</a> </li>    <li><a href="https://code.msdn.microsoft.com/windowsapps/Service-Bus-Explorer-f2abca5a">Service Bus Explorer</a> </li>    <li><a href="https://channel9.msdn.com/Shows/Cloud+Cover/Episode-160-Event-Hubs-with-Elio-Damaggio">Episode 160: Event Hubs with Elio Damaggio</a> (video) </li>    <li><a href="https://channel9.msdn.com/Events/TechEd/Europe/2014/CDP-B307">Telemetry and Data Flow at Hyper-Scale: Azure Event Hub</a> (video) </li>    <li><a href="https://github.com/mspnp/data-pipeline">Data Pipeline Guidance</a>&#160; (Patterns &amp; Practices solution) </li>    <li><a href="http://blogs.msdn.com/b/servicebus/archive/2015/01/16/event-processor-host-best-practices-part-1.aspx">Event Processor Host Best Practices Part 1</a> </li>    <li><a href="http://blogs.msdn.com/b/servicebus/archive/2015/01/21/event-processor-host-best-practices-part-2.aspx">Event Processor Host Best Practices Part 2</a> </li>    <li><a href="http://blogs.msdn.com/b/paolos/archive/2014/12/01/how-to-create-a-service-bus-namespace-and-an-event-hub-using-a-powershell-script.aspx">How to create a Service Bus Namespace and an Event Hub using a PowerShell script</a> </li> </ul>  <p>Table-Valued Parameters</p>  <ul>   <li><a href="https://msdn.microsoft.com/en-us/library/azure/dn132615.aspx?f=255&amp;MSPPError=-2147217396#tablevaluedparameters">Batching Techniques for SQL Database Applications in Azure</a> </li>    <li><a href="https://msdn.microsoft.com/en-us/library/bb510489.aspx">Use Table-Valued Parameters (Database Engine)</a> </li>    <li><a href="https://msdn.microsoft.com/en-us/library/bb675163%28v=vs.110%29.aspx?f=255&amp;MSPPError=-2147217396">Table-Valued Parameter</a> </li> </ul>  <p>ETW Logs</p>  <ul>   <li><a href="http://azure.microsoft.com/blog/2014/11/12/announcing-azure-sdk-2-5-for-net-and-visual-studio-2015-preview/">Diagnostics: Improved diagnostics logging with ETW</a> </li> </ul>  <div class="endscriptcode">   <h1 class="endscriptcode">Visual Studio Solution</h1> </div>  <div></div>  <div class="endscriptcode">The Visual Studio solution includes the following projects:</div>  <div class="endscriptcode">&#160;</div>  <ul>   <li>     <div class="endscriptcode"><strong>CreateIoTDbWithMerge.sql</strong>: this script can be used to create the SQL Server database used to store device events.</div>   </li>    <li>     <div class="endscriptcode"><strong>Entities</strong>: this library contains the <strong>Payload </strong>class. This class defines the structure and content of the <a href="https://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.eventdata.aspx?f=255&amp;MSPPError=-2147217396">EventData</a> message body.</div>   </li>    <li>     <div class="endscriptcode"><strong>EventProcessorHostWorkerRole</strong>: this library defines the worker role used to handle the events from the event hub.</div>   </li>    <li>     <div class="endscriptcode"><strong>Helpers</strong>: this library defines the <strong>TraceEventSource </strong>class used by the worker role to create ETW logs at runtime.</div>   </li>    <li>     <div class="endscriptcode"><strong>Sender</strong>: this Windows Forms application can be used to create the Event Hub used by the sample and simulate a configurable amount of devices sending events to the event hub.</div>   </li>    <li>     <div class="endscriptcode"><strong>StoreEventsToAzureSqlDatabase</strong>: this Azure project defines the cloud service hosting the worker role used to handle the events from the event hub.</div>   </li> </ul>  <p class="endscriptcode"><strong>NOTE</strong>: To reduce the size of tha zip file, I deleted the NuGet packages. To repair the solution, make sure to right click the solution and select <strong>Enable NuGet Package Restore </strong>as shown in the picture below. For more information on this topic, see the following <a href="http://blogs.4ward.it/enable-nuget-package-restore-in-visual-studio-and-tfs-2012-rc-to-building-windows-8-metro-apps/">post</a>.</p>  <h1 class="endscriptcode">Solution</h1>  <p>This section briefly describes the individual components of the solution.</p>  <h2>SQL Azure Database</h2>  <p><span>Run the </span><strong><strong>CreateIoTDbWithMerge</strong>.sql </strong><span>script to create the database used by the solution. In particular, the script create the following artifacts:</span></p>  <ul>   <li>The <strong>EventTableType </strong>used-defined table type. </li>    <li>The <strong>Events </strong>table used to store events. </li>    <li>The <strong>sp_InsertEvents</strong> stored procedure used to store events. The stored procedure receives a single <strong>EventTableType </strong>parameter and uses the <a href="https://msdn.microsoft.com/en-us/library/bb510625.aspx">MERGE</a> statement to implement an UPSERT mechanism. This mechanism is used to implement idempotency: if an row already exists in the table with the a given EventId, the store procedure updates its columns, otherwise a new record is created. </li> </ul>  <div class="scriptcode">   <div class="pluginEditHolder" plugincommand="mceScriptCode">     <div id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:3aeb7cef-7b8b-4b22-b45c-ef224cd38eb9" class="wlWriterEditableSmartContent" style="margin: 0px; padding: 0px; float: none; display: inline;"><pre style="background-color:#FFFFFF;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;overflow: auto;"><span style="color: #008080;">--</span><span style="color: #008080;"> Drop sp_InsertEvents stored procedure </span><span style="color: #008080;">
</span><span style="color: #0000FF;">IF</span><span style="color: #000000;"> </span><span style="color: #FF00FF;">OBJECT_ID</span><span style="color: #000000;">(</span><span style="color: #FF0000;">'</span><span style="color: #FF0000;">sp_InsertEvents</span><span style="color: #FF0000;">'</span><span style="color: #000000;">) </span><span style="color: #808080;">&gt;</span><span style="color: #000000;"> </span><span style="color: #800000; font-weight: bold;">0</span><span style="color: #000000;"> </span><span style="color: #0000FF;">DROP</span><span style="color: #000000;"> </span><span style="color: #0000FF;">PROCEDURE</span><span style="color: #000000;"> </span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">dbo</span><span style="color: #FF0000;">]</span><span style="color: #000000;">.</span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">sp_InsertEvents</span><span style="color: #FF0000;">]</span><span style="color: #000000;"> 
</span><span style="color: #0000FF;">GO</span><span style="color: #000000;"> 
 
</span><span style="color: #008080;">--</span><span style="color: #008080;"> Drop Events table </span><span style="color: #008080;">
</span><span style="color: #0000FF;">IF</span><span style="color: #000000;"> </span><span style="color: #FF00FF;">OBJECT_ID</span><span style="color: #000000;">(</span><span style="color: #FF0000;">'</span><span style="color: #FF0000;">Events</span><span style="color: #FF0000;">'</span><span style="color: #000000;">) </span><span style="color: #808080;">&gt;</span><span style="color: #000000;"> </span><span style="color: #800000; font-weight: bold;">0</span><span style="color: #000000;"> </span><span style="color: #0000FF;">DROP</span><span style="color: #000000;"> </span><span style="color: #0000FF;">TABLE</span><span style="color: #000000;"> </span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">dbo</span><span style="color: #FF0000;">]</span><span style="color: #000000;">.</span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">Events</span><span style="color: #FF0000;">]</span><span style="color: #000000;"> 
</span><span style="color: #0000FF;">GO</span><span style="color: #000000;"> 
 
</span><span style="color: #008080;">--</span><span style="color: #008080;"> Drop EventTableType used-defined table type </span><span style="color: #008080;">
</span><span style="color: #0000FF;">DROP</span><span style="color: #000000;"> TYPE </span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">dbo</span><span style="color: #FF0000;">]</span><span style="color: #000000;">.</span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">EventTableType</span><span style="color: #FF0000;">]</span><span style="color: #000000;"> 
</span><span style="color: #0000FF;">GO</span><span style="color: #000000;"> 
 
</span><span style="color: #008080;">--</span><span style="color: #008080;"> Create EventTableType used-defined table type </span><span style="color: #008080;">
</span><span style="color: #0000FF;">CREATE</span><span style="color: #000000;"> TYPE </span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">dbo</span><span style="color: #FF0000;">]</span><span style="color: #000000;">.</span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">EventTableType</span><span style="color: #FF0000;">]</span><span style="color: #000000;"> </span><span style="color: #0000FF;">AS</span><span style="color: #000000;"> </span><span style="color: #0000FF;">TABLE</span><span style="color: #000000;">( 
    </span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">EventId</span><span style="color: #FF0000;">]</span><span style="color: #000000;"> </span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">int</span><span style="color: #FF0000;">]</span><span style="color: #000000;"> </span><span style="color: #808080;">NOT</span><span style="color: #000000;"> </span><span style="color: #0000FF;">NULL</span><span style="color: #000000;">, 
    </span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">DeviceId</span><span style="color: #FF0000;">]</span><span style="color: #000000;"> </span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">int</span><span style="color: #FF0000;">]</span><span style="color: #000000;"> </span><span style="color: #0000FF;">NULL</span><span style="color: #000000;">, 
    </span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">Value</span><span style="color: #FF0000;">]</span><span style="color: #000000;"> </span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">int</span><span style="color: #FF0000;">]</span><span style="color: #000000;"> </span><span style="color: #0000FF;">NULL</span><span style="color: #000000;">, 
    </span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">Timestamp</span><span style="color: #FF0000;">]</span><span style="color: #000000;"> </span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">datetime2</span><span style="color: #FF0000;">]</span><span style="color: #000000;">(</span><span style="color: #800000; font-weight: bold;">7</span><span style="color: #000000;">) </span><span style="color: #0000FF;">NULL</span><span style="color: #000000;"> 
) 
</span><span style="color: #0000FF;">GO</span><span style="color: #000000;"> 
 
</span><span style="color: #0000FF;">SET</span><span style="color: #000000;"> ANSI_NULLS </span><span style="color: #0000FF;">ON</span><span style="color: #000000;"> 
</span><span style="color: #0000FF;">GO</span><span style="color: #000000;"> 
 
</span><span style="color: #0000FF;">SET</span><span style="color: #000000;"> QUOTED_IDENTIFIER </span><span style="color: #0000FF;">ON</span><span style="color: #000000;"> 
</span><span style="color: #0000FF;">GO</span><span style="color: #000000;"> 
 
</span><span style="color: #008080;">--</span><span style="color: #008080;"> Create Events table </span><span style="color: #008080;">
</span><span style="color: #0000FF;">CREATE</span><span style="color: #000000;"> </span><span style="color: #0000FF;">TABLE</span><span style="color: #000000;"> </span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">dbo</span><span style="color: #FF0000;">]</span><span style="color: #000000;">.</span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">Events</span><span style="color: #FF0000;">]</span><span style="color: #000000;">( 
    </span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">EventId</span><span style="color: #FF0000;">]</span><span style="color: #000000;"> </span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">int</span><span style="color: #FF0000;">]</span><span style="color: #000000;"> </span><span style="color: #808080;">NOT</span><span style="color: #000000;"> </span><span style="color: #0000FF;">NULL</span><span style="color: #000000;">, 
    </span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">DeviceId</span><span style="color: #FF0000;">]</span><span style="color: #000000;"> </span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">int</span><span style="color: #FF0000;">]</span><span style="color: #000000;"> </span><span style="color: #808080;">NOT</span><span style="color: #000000;"> </span><span style="color: #0000FF;">NULL</span><span style="color: #000000;">, 
    </span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">Value</span><span style="color: #FF0000;">]</span><span style="color: #000000;"> </span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">int</span><span style="color: #FF0000;">]</span><span style="color: #000000;"> </span><span style="color: #808080;">NOT</span><span style="color: #000000;"> </span><span style="color: #0000FF;">NULL</span><span style="color: #000000;">, 
    </span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">Timestamp</span><span style="color: #FF0000;">]</span><span style="color: #000000;"> </span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">datetime2</span><span style="color: #FF0000;">]</span><span style="color: #000000;">(</span><span style="color: #800000; font-weight: bold;">7</span><span style="color: #000000;">) </span><span style="color: #0000FF;">NULL</span><span style="color: #000000;">, 
</span><span style="color: #0000FF;">PRIMARY</span><span style="color: #000000;"> </span><span style="color: #0000FF;">KEY</span><span style="color: #000000;"> </span><span style="color: #0000FF;">CLUSTERED</span><span style="color: #000000;">  
( 
    </span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">EventId</span><span style="color: #FF0000;">]</span><span style="color: #000000;"> </span><span style="color: #0000FF;">ASC</span><span style="color: #000000;"> 
)</span><span style="color: #0000FF;">WITH</span><span style="color: #000000;"> (PAD_INDEX </span><span style="color: #808080;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">OFF</span><span style="color: #000000;">,  
       STATISTICS_NORECOMPUTE </span><span style="color: #808080;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">OFF</span><span style="color: #000000;">,  
       IGNORE_DUP_KEY </span><span style="color: #808080;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">OFF</span><span style="color: #000000;">,  
       ALLOW_ROW_LOCKS </span><span style="color: #808080;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">ON</span><span style="color: #000000;">,  
       ALLOW_PAGE_LOCKS </span><span style="color: #808080;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">ON</span><span style="color: #000000;">) </span><span style="color: #0000FF;">ON</span><span style="color: #000000;"> </span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">PRIMARY</span><span style="color: #FF0000;">]</span><span style="color: #000000;"> 
) </span><span style="color: #0000FF;">ON</span><span style="color: #000000;"> </span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">PRIMARY</span><span style="color: #FF0000;">]</span><span style="color: #000000;"> 
</span><span style="color: #0000FF;">GO</span><span style="color: #000000;"> 
 
</span><span style="color: #008080;">--</span><span style="color: #008080;"> Create sp_InsertEvents stored procedure </span><span style="color: #008080;">
</span><span style="color: #0000FF;">CREATE</span><span style="color: #000000;"> </span><span style="color: #0000FF;">PROCEDURE</span><span style="color: #000000;"> </span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">dbo</span><span style="color: #FF0000;">]</span><span style="color: #000000;">.</span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">sp_InsertEvents</span><span style="color: #FF0000;">]</span><span style="color: #000000;">  
    </span><span style="color: #008000;">@Events</span><span style="color: #000000;"> dbo.EventTableType READONLY 
</span><span style="color: #0000FF;">AS</span><span style="color: #000000;">  
</span><span style="color: #0000FF;">BEGIN</span><span style="color: #000000;"> 
    MERGE </span><span style="color: #0000FF;">INTO</span><span style="color: #000000;"> dbo.</span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">Events</span><span style="color: #FF0000;">]</span><span style="color: #000000;"> </span><span style="color: #0000FF;">AS</span><span style="color: #000000;"> A 
    USING ( 
        </span><span style="color: #0000FF;">SELECT</span><span style="color: #000000;"> </span><span style="color: #808080;">*</span><span style="color: #000000;"> </span><span style="color: #0000FF;">FROM</span><span style="color: #000000;"> </span><span style="color: #008000;">@Events</span><span style="color: #000000;"> 
    ) B </span><span style="color: #0000FF;">ON</span><span style="color: #000000;"> (A.EventId </span><span style="color: #808080;">=</span><span style="color: #000000;"> B.EventId) 
    </span><span style="color: #0000FF;">WHEN</span><span style="color: #000000;"> MATCHED </span><span style="color: #0000FF;">THEN</span><span style="color: #000000;"> 
        </span><span style="color: #0000FF;">UPDATE</span><span style="color: #000000;"> </span><span style="color: #0000FF;">SET</span><span style="color: #000000;"> A.DeviceId </span><span style="color: #808080;">=</span><span style="color: #000000;"> B.DeviceId, 
                   A.Value </span><span style="color: #808080;">=</span><span style="color: #000000;"> B.Value, 
                   A.</span><span style="color: #0000FF;">Timestamp</span><span style="color: #000000;"> </span><span style="color: #808080;">=</span><span style="color: #000000;"> B.</span><span style="color: #0000FF;">Timestamp</span><span style="color: #000000;"> 
    </span><span style="color: #0000FF;">WHEN</span><span style="color: #000000;"> </span><span style="color: #808080;">NOT</span><span style="color: #000000;"> MATCHED </span><span style="color: #0000FF;">THEN</span><span style="color: #000000;"> 
        </span><span style="color: #0000FF;">INSERT</span><span style="color: #000000;"> (</span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">EventId</span><span style="color: #FF0000;">]</span><span style="color: #000000;">, </span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">DeviceId</span><span style="color: #FF0000;">]</span><span style="color: #000000;">, </span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">Value</span><span style="color: #FF0000;">]</span><span style="color: #000000;">, </span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">Timestamp</span><span style="color: #FF0000;">]</span><span style="color: #000000;">)  
        </span><span style="color: #0000FF;">VALUES</span><span style="color: #000000;">(B.</span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">EventId</span><span style="color: #FF0000;">]</span><span style="color: #000000;">, B.</span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">DeviceId</span><span style="color: #FF0000;">]</span><span style="color: #000000;">, B.</span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">Value</span><span style="color: #FF0000;">]</span><span style="color: #000000;">, B.</span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">Timestamp</span><span style="color: #FF0000;">]</span><span style="color: #000000;">); 
</span><span style="color: #0000FF;">END</span><span style="color: #000000;"> 
</span><span style="color: #0000FF;">GO</span></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --></div>
  </div>
</div>

<h2 class="endscriptcode">Entities</h2>

<div class="endscriptcode">The following table contains the code of the <strong>Payload</strong> class. This class is used to define the body of the messages sent to the event hub. Note that the properties of the class are decorated with the <strong>JsonPropertyAttribute</strong>. In fact, both the client application and worker role use <a href="http://www.newtonsoft.com/json">Json.Net</a> to serialize and deserialize the message content in JSON.</div>

<div id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:03b6dc69-4829-4923-b0b1-fc90580b063c" class="wlWriterEditableSmartContent" style="margin: 0px; padding: 0px; float: none; display: inline;"><pre style="background-color:#FFFFFF;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;overflow: auto;"><span style="color: #0000FF;">#region</span><span style="color: #000000;"> Using Directives </span><span style="color: #000000;">
</span><span style="color: #0000FF;">using</span><span style="color: #000000;"> System; 
</span><span style="color: #0000FF;">using</span><span style="color: #000000;"> Newtonsoft.Json;  
</span><span style="color: #0000FF;">#endregion</span><span style="color: #000000;"> </span><span style="color: #000000;">
 
</span><span style="color: #0000FF;">namespace</span><span style="color: #000000;"> Microsoft.AzureCat.Samples.Entities 
{ 
    [Serializable] 
    </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">class</span><span style="color: #000000;"> Payload 
    { 
        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;summary&gt;</span><span style="color: #008000;"> 
        </span><span style="color: #808080;">///</span><span style="color: #008000;"> Gets or sets the device id. 
        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;/summary&gt;</span><span style="color: #008000;"> </span><span style="color: #808080;">
</span><span style="color: #000000;">        [JsonProperty(PropertyName </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">eventId</span><span style="color: #800000;">"</span><span style="color: #000000;">, Order </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">1</span><span style="color: #000000;">)] 
        </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">int</span><span style="color: #000000;"> EventId { </span><span style="color: #0000FF;">get</span><span style="color: #000000;">; </span><span style="color: #0000FF;">set</span><span style="color: #000000;">; } 
 
        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;summary&gt;</span><span style="color: #008000;"> 
        </span><span style="color: #808080;">///</span><span style="color: #008000;"> Gets or sets the device id. 
        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;/summary&gt;</span><span style="color: #008000;"> </span><span style="color: #808080;">
</span><span style="color: #000000;">        [JsonProperty(PropertyName </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">deviceId</span><span style="color: #800000;">"</span><span style="color: #000000;">, Order </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">2</span><span style="color: #000000;">)] 
        </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">int</span><span style="color: #000000;"> DeviceId { </span><span style="color: #0000FF;">get</span><span style="color: #000000;">; </span><span style="color: #0000FF;">set</span><span style="color: #000000;">; } 
 
        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;summary&gt;</span><span style="color: #008000;"> 
        </span><span style="color: #808080;">///</span><span style="color: #008000;"> Gets or sets the device value. 
        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;/summary&gt;</span><span style="color: #008000;"> </span><span style="color: #808080;">
</span><span style="color: #000000;">        [JsonProperty(PropertyName </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">value</span><span style="color: #800000;">"</span><span style="color: #000000;">, Order </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">3</span><span style="color: #000000;">)] 
        </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">int</span><span style="color: #000000;"> Value { </span><span style="color: #0000FF;">get</span><span style="color: #000000;">; </span><span style="color: #0000FF;">set</span><span style="color: #000000;">; } 
 
        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;summary&gt;</span><span style="color: #008000;"> 
        </span><span style="color: #808080;">///</span><span style="color: #008000;"> Gets or sets the event timestamp. 
        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;/summary&gt;</span><span style="color: #008000;"> </span><span style="color: #808080;">
</span><span style="color: #000000;">        [JsonProperty(PropertyName </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">timestamp</span><span style="color: #800000;">"</span><span style="color: #000000;">, Order </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">4</span><span style="color: #000000;">)] 
        </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> DateTime Timestamp { </span><span style="color: #0000FF;">get</span><span style="color: #000000;">; </span><span style="color: #0000FF;">set</span><span style="color: #000000;">; } 
    } 
}</span></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --></div>

<h2 class="endscriptcode">Helpers</h2>

<div class="endscriptcode">This library defines the <strong>TraceEventSource </strong>class used by the worker role to trace events to ETW logs. The WAD agent running on the worker role instances will read data out of local ETW logs and persist this data to a couple of storage tables (<strong>WASDiagnosticTable</strong> and <strong>WADEventProcessorTable</strong>) in the storage account configured for Windows Azure Diagnostics.</div>

<div id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:bbc0d3ce-b198-49dc-9df3-f0c15b82d583" class="wlWriterEditableSmartContent" style="margin: 0px; padding: 0px; float: none; display: inline;"><pre style="background-color:#FFFFFF;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;overflow: auto;"><span style="color: #0000FF;">#region</span><span style="color: #000000;"> Using Directives</span><span style="color: #000000;">
</span><span style="color: #0000FF;">using</span><span style="color: #000000;"> System;
</span><span style="color: #0000FF;">using</span><span style="color: #000000;"> System.Diagnostics.Tracing;
</span><span style="color: #0000FF;">using</span><span style="color: #000000;"> System.Runtime.CompilerServices;
</span><span style="color: #0000FF;">using</span><span style="color: #000000;"> Microsoft.WindowsAzure.ServiceRuntime;

</span><span style="color: #0000FF;">#endregion</span><span style="color: #000000;">

</span><span style="color: #0000FF;">namespace</span><span style="color: #000000;"> Microsoft.AzureCat.Samples.Helpers
{
    [EventSource(Name </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">TraceEventSource</span><span style="color: #800000;">"</span><span style="color: #000000;">)]
    </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">sealed</span><span style="color: #000000;"> </span><span style="color: #0000FF;">class</span><span style="color: #000000;"> TraceEventSource : EventSource
    {
        </span><span style="color: #0000FF;">#region</span><span style="color: #000000;"> Internal Enums</span><span style="color: #000000;">
        </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">class</span><span style="color: #000000;"> Keywords
        {
            </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> EventKeywords EventHub </span><span style="color: #000000;">=</span><span style="color: #000000;"> (EventKeywords)</span><span style="color: #800080;">1</span><span style="color: #000000;">;
            </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> EventKeywords DataBase </span><span style="color: #000000;">=</span><span style="color: #000000;"> (EventKeywords)</span><span style="color: #800080;">2</span><span style="color: #000000;">;
            </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> EventKeywords Diagnostic </span><span style="color: #000000;">=</span><span style="color: #000000;"> (EventKeywords)</span><span style="color: #800080;">4</span><span style="color: #000000;">;
            </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> EventKeywords Performance </span><span style="color: #000000;">=</span><span style="color: #000000;"> (EventKeywords)</span><span style="color: #800080;">8</span><span style="color: #000000;">;
        }
        </span><span style="color: #0000FF;">#endregion</span><span style="color: #000000;">

        </span><span style="color: #0000FF;">#region</span><span style="color: #000000;"> Public Static Properties</span><span style="color: #000000;">
        </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">static</span><span style="color: #000000;"> </span><span style="color: #0000FF;">readonly</span><span style="color: #000000;"> TraceEventSource Log </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> TraceEventSource(); 
        </span><span style="color: #0000FF;">#endregion</span><span style="color: #000000;">

        </span><span style="color: #0000FF;">#region</span><span style="color: #000000;"> Private Methods</span><span style="color: #000000;">
        [Event(</span><span style="color: #800080;">1</span><span style="color: #000000;">,
       Message </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">TraceIn</span><span style="color: #800000;">"</span><span style="color: #000000;">,
       Keywords </span><span style="color: #000000;">=</span><span style="color: #000000;"> Keywords.Diagnostic,
       Level </span><span style="color: #000000;">=</span><span style="color: #000000;"> EventLevel.Verbose)]
        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">void</span><span style="color: #000000;"> TraceIn(</span><span style="color: #0000FF;">string</span><span style="color: #000000;"> application,
                             </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> instance,
                             Guid activityId,
                             </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> description,
                             </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> source,
                             </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> method)
        {
            </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (</span><span style="color: #0000FF;">string</span><span style="color: #000000;">.IsNullOrWhiteSpace(application) </span><span style="color: #000000;">||</span><span style="color: #000000;">
                </span><span style="color: #0000FF;">string</span><span style="color: #000000;">.IsNullOrWhiteSpace(instance))
            {
                </span><span style="color: #0000FF;">return</span><span style="color: #000000;">;
            }
            WriteEvent(</span><span style="color: #800080;">1</span><span style="color: #000000;">, application, instance, activityId, description, source, method);
        }

        [Event(</span><span style="color: #800080;">2</span><span style="color: #000000;">,
               Message </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">TraceOut</span><span style="color: #800000;">"</span><span style="color: #000000;">,
               Keywords </span><span style="color: #000000;">=</span><span style="color: #000000;"> Keywords.Diagnostic,
               Level </span><span style="color: #000000;">=</span><span style="color: #000000;"> EventLevel.Verbose)]
        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">void</span><span style="color: #000000;"> TraceOut(</span><span style="color: #0000FF;">string</span><span style="color: #000000;"> application,
                              </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> instance,
                              Guid activityId,
                              </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> description,
                              </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> source,
                              </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> method)
        {
            </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (</span><span style="color: #0000FF;">string</span><span style="color: #000000;">.IsNullOrWhiteSpace(application) </span><span style="color: #000000;">||</span><span style="color: #000000;">
                </span><span style="color: #0000FF;">string</span><span style="color: #000000;">.IsNullOrWhiteSpace(instance))
            {
                </span><span style="color: #0000FF;">return</span><span style="color: #000000;">;
            }
            WriteEvent(</span><span style="color: #800080;">2</span><span style="color: #000000;">, application, instance, activityId, description, source, method);
        }

        [Event(</span><span style="color: #800080;">3</span><span style="color: #000000;">,
               Message </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">TraceApi</span><span style="color: #800000;">"</span><span style="color: #000000;">,
               Keywords </span><span style="color: #000000;">=</span><span style="color: #000000;"> Keywords.Diagnostic,
               Level </span><span style="color: #000000;">=</span><span style="color: #000000;"> EventLevel.Informational)]
        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">void</span><span style="color: #000000;"> TraceExec(</span><span style="color: #0000FF;">string</span><span style="color: #000000;"> application,
                               </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> instance,
                               Guid activityId,
                               </span><span style="color: #0000FF;">double</span><span style="color: #000000;"> elapsed,
                               </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> description,
                               </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> source,
                               </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> method)
        {
            </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (</span><span style="color: #0000FF;">string</span><span style="color: #000000;">.IsNullOrWhiteSpace(application) </span><span style="color: #000000;">||</span><span style="color: #000000;">
                </span><span style="color: #0000FF;">string</span><span style="color: #000000;">.IsNullOrWhiteSpace(instance) </span><span style="color: #000000;">||</span><span style="color: #000000;">
                </span><span style="color: #0000FF;">string</span><span style="color: #000000;">.IsNullOrWhiteSpace(description))
            {
                </span><span style="color: #0000FF;">return</span><span style="color: #000000;">;
            }
            WriteEvent(</span><span style="color: #800080;">3</span><span style="color: #000000;">, application, instance, activityId, elapsed, description, source, method);
        }

        [Event(</span><span style="color: #800080;">4</span><span style="color: #000000;">,
               Message </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">TraceInfo</span><span style="color: #800000;">"</span><span style="color: #000000;">,
               Keywords </span><span style="color: #000000;">=</span><span style="color: #000000;"> Keywords.Diagnostic,
               Level </span><span style="color: #000000;">=</span><span style="color: #000000;"> EventLevel.Informational)]
        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">void</span><span style="color: #000000;"> TraceInfo(</span><span style="color: #0000FF;">string</span><span style="color: #000000;"> application,
                               </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> instance,
                               </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> description,
                               </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> source,
                               </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> method)
        {
            </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (</span><span style="color: #0000FF;">string</span><span style="color: #000000;">.IsNullOrWhiteSpace(application) </span><span style="color: #000000;">||</span><span style="color: #000000;">
                </span><span style="color: #0000FF;">string</span><span style="color: #000000;">.IsNullOrWhiteSpace(instance) </span><span style="color: #000000;">||</span><span style="color: #000000;">
                </span><span style="color: #0000FF;">string</span><span style="color: #000000;">.IsNullOrWhiteSpace(description))
            {
                </span><span style="color: #0000FF;">return</span><span style="color: #000000;">;
            }
            WriteEvent(</span><span style="color: #800080;">4</span><span style="color: #000000;">, application, instance, description, source, method);
        }

        [Event(</span><span style="color: #800080;">5</span><span style="color: #000000;">,
               Message </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">TraceError</span><span style="color: #800000;">"</span><span style="color: #000000;">,
               Keywords </span><span style="color: #000000;">=</span><span style="color: #000000;"> Keywords.Diagnostic,
               Level </span><span style="color: #000000;">=</span><span style="color: #000000;"> EventLevel.Error)]
        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">void</span><span style="color: #000000;"> TraceError(</span><span style="color: #0000FF;">string</span><span style="color: #000000;"> application,
                                </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> instance,
                                Guid activityId,
                                </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> exception,
                                </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> innerException,
                                </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> source,
                                </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> method)
        {
            </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (</span><span style="color: #0000FF;">string</span><span style="color: #000000;">.IsNullOrWhiteSpace(application) </span><span style="color: #000000;">||</span><span style="color: #000000;">
                </span><span style="color: #0000FF;">string</span><span style="color: #000000;">.IsNullOrWhiteSpace(instance) </span><span style="color: #000000;">||</span><span style="color: #000000;">
                </span><span style="color: #0000FF;">string</span><span style="color: #000000;">.IsNullOrWhiteSpace(exception))
            {
                </span><span style="color: #0000FF;">return</span><span style="color: #000000;">;
            }
            WriteEvent(</span><span style="color: #800080;">5</span><span style="color: #000000;">, application, instance, activityId, exception, </span><span style="color: #0000FF;">string</span><span style="color: #000000;">.IsNullOrWhiteSpace(innerException) </span><span style="color: #000000;">?</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;">.Empty : innerException, source, method);
        }

        [Event(</span><span style="color: #800080;">6</span><span style="color: #000000;">,
               Message </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">OpenPartition</span><span style="color: #800000;">"</span><span style="color: #000000;">,
               Keywords </span><span style="color: #000000;">=</span><span style="color: #000000;"> Keywords.EventHub,
               Level </span><span style="color: #000000;">=</span><span style="color: #000000;"> EventLevel.Informational)]
        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">void</span><span style="color: #000000;"> OpenPartition(</span><span style="color: #0000FF;">string</span><span style="color: #000000;"> application, 
                                   </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> instance, 
                                   </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> eventHub, 
                                   </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> consumerGroup, 
                                   </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> partitionId, 
                                   </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> source, 
                                   </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> method)
        {
            </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (</span><span style="color: #0000FF;">string</span><span style="color: #000000;">.IsNullOrWhiteSpace(application) </span><span style="color: #000000;">||</span><span style="color: #000000;">
                </span><span style="color: #0000FF;">string</span><span style="color: #000000;">.IsNullOrWhiteSpace(instance) </span><span style="color: #000000;">||</span><span style="color: #000000;">
                </span><span style="color: #0000FF;">string</span><span style="color: #000000;">.IsNullOrWhiteSpace(eventHub) </span><span style="color: #000000;">||</span><span style="color: #000000;">
                </span><span style="color: #0000FF;">string</span><span style="color: #000000;">.IsNullOrWhiteSpace(consumerGroup) </span><span style="color: #000000;">||</span><span style="color: #000000;">
                </span><span style="color: #0000FF;">string</span><span style="color: #000000;">.IsNullOrWhiteSpace(partitionId))
            {
                </span><span style="color: #0000FF;">return</span><span style="color: #000000;">;
            }
            WriteEvent(</span><span style="color: #800080;">6</span><span style="color: #000000;">, application, instance, eventHub, consumerGroup, partitionId, source, method);
        }

        [Event(</span><span style="color: #800080;">7</span><span style="color: #000000;">,
               Message </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">ClosePartition</span><span style="color: #800000;">"</span><span style="color: #000000;">,
               Keywords </span><span style="color: #000000;">=</span><span style="color: #000000;"> Keywords.EventHub,
               Level </span><span style="color: #000000;">=</span><span style="color: #000000;"> EventLevel.Informational)]
        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">void</span><span style="color: #000000;"> ClosePartition(</span><span style="color: #0000FF;">string</span><span style="color: #000000;"> application, 
                                    </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> instance, 
                                    </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> eventHub, 
                                    </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> consumerGroup, 
                                    </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> partitionId, 
                                    </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> reason, 
                                    </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> source, 
                                    </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> method)
        {
            </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (</span><span style="color: #0000FF;">string</span><span style="color: #000000;">.IsNullOrWhiteSpace(application) </span><span style="color: #000000;">||</span><span style="color: #000000;">
                </span><span style="color: #0000FF;">string</span><span style="color: #000000;">.IsNullOrWhiteSpace(instance) </span><span style="color: #000000;">||</span><span style="color: #000000;">
                </span><span style="color: #0000FF;">string</span><span style="color: #000000;">.IsNullOrWhiteSpace(eventHub) </span><span style="color: #000000;">||</span><span style="color: #000000;">
                </span><span style="color: #0000FF;">string</span><span style="color: #000000;">.IsNullOrWhiteSpace(consumerGroup) </span><span style="color: #000000;">||</span><span style="color: #000000;">
                </span><span style="color: #0000FF;">string</span><span style="color: #000000;">.IsNullOrWhiteSpace(partitionId))
            {
                </span><span style="color: #0000FF;">return</span><span style="color: #000000;">;
            }
            WriteEvent(</span><span style="color: #800080;">7</span><span style="color: #000000;">, application, instance, eventHub, consumerGroup, partitionId, reason, source, method);
        }

        [Event(</span><span style="color: #800080;">8</span><span style="color: #000000;">,
               Message </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">ProcessEvents</span><span style="color: #800000;">"</span><span style="color: #000000;">,
               Keywords </span><span style="color: #000000;">=</span><span style="color: #000000;"> Keywords.EventHub,
               Level </span><span style="color: #000000;">=</span><span style="color: #000000;"> EventLevel.Informational)]
        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">void</span><span style="color: #000000;"> ProcessEvents(</span><span style="color: #0000FF;">string</span><span style="color: #000000;"> application, 
                                   </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> instance, 
                                   </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> eventHub, 
                                   </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> consumerGroup, 
                                   </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> partitionId, 
                                   </span><span style="color: #0000FF;">int</span><span style="color: #000000;"> messageCount, 
                                   </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> source, 
                                   </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> method)
        {
            </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (</span><span style="color: #0000FF;">string</span><span style="color: #000000;">.IsNullOrWhiteSpace(application) </span><span style="color: #000000;">||</span><span style="color: #000000;">
                </span><span style="color: #0000FF;">string</span><span style="color: #000000;">.IsNullOrWhiteSpace(instance) </span><span style="color: #000000;">||</span><span style="color: #000000;">
                </span><span style="color: #0000FF;">string</span><span style="color: #000000;">.IsNullOrWhiteSpace(eventHub) </span><span style="color: #000000;">||</span><span style="color: #000000;">
                </span><span style="color: #0000FF;">string</span><span style="color: #000000;">.IsNullOrWhiteSpace(consumerGroup) </span><span style="color: #000000;">||</span><span style="color: #000000;">
                </span><span style="color: #0000FF;">string</span><span style="color: #000000;">.IsNullOrWhiteSpace(partitionId))
            {
                </span><span style="color: #0000FF;">return</span><span style="color: #000000;">;
            }
            </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (IsEnabled())
            {
                WriteEvent(</span><span style="color: #800080;">8</span><span style="color: #000000;">, application, instance, eventHub, consumerGroup, partitionId, messageCount, source, method);
            }
        } 
        </span><span style="color: #0000FF;">#endregion</span><span style="color: #000000;">

        </span><span style="color: #0000FF;">#region</span><span style="color: #000000;"> Public Methods</span><span style="color: #000000;">
        [NonEvent]
        </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">void</span><span style="color: #000000;"> TraceApi(TimeSpan elapsed,
                             </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> description,
                             [CallerFilePath] </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> source </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">""</span><span style="color: #000000;">,
                             [CallerMemberName] </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> method </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">""</span><span style="color: #000000;">)
        {
            </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (IsEnabled())
            {
                TraceExec(RoleEnvironment.CurrentRoleInstance.Role.Name,
                          RoleEnvironment.CurrentRoleInstance.Id,
                          Guid.NewGuid(),
                          elapsed.TotalMilliseconds,
                          description,
                          source,
                          method);
            }
        }

        [NonEvent]
        </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">void</span><span style="color: #000000;"> TraceApi(Guid activityId,
                             TimeSpan elapsed,
                             </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> description,
                             [CallerFilePath] </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> source </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">""</span><span style="color: #000000;">,
                             [CallerMemberName] </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> method </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">""</span><span style="color: #000000;">)
        {
            </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (IsEnabled())
            {
                TraceExec(RoleEnvironment.CurrentRoleInstance.Role.Name,
                          RoleEnvironment.CurrentRoleInstance.Id,
                          activityId,
                          elapsed.TotalMilliseconds,
                          description,
                          source,
                          method);
            }
        }

        [NonEvent]
        </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">void</span><span style="color: #000000;"> TraceIn([CallerFilePath] </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> source </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">""</span><span style="color: #000000;">,
                            [CallerMemberName] </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> method </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">""</span><span style="color: #000000;">)
        {
            </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (IsEnabled())
            {
                TraceIn(RoleEnvironment.CurrentRoleInstance.Role.Name,
                        RoleEnvironment.CurrentRoleInstance.Id,
                        Guid.NewGuid(),
                        </span><span style="color: #0000FF;">string</span><span style="color: #000000;">.Empty,
                        source,
                        method);
            }
        }

        [NonEvent]
        </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">void</span><span style="color: #000000;"> TraceOut([CallerFilePath] </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> source </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">""</span><span style="color: #000000;">,
                             [CallerMemberName] </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> method </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">""</span><span style="color: #000000;">)
        {
            </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (IsEnabled())
            {
                TraceOut(RoleEnvironment.CurrentRoleInstance.Role.Name,
                         RoleEnvironment.CurrentRoleInstance.Id,
                         Guid.NewGuid(),
                         </span><span style="color: #0000FF;">string</span><span style="color: #000000;">.Empty,
                         source,
                         method);
            }
        }

        [NonEvent]
        </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">void</span><span style="color: #000000;"> TraceInfo(</span><span style="color: #0000FF;">string</span><span style="color: #000000;"> description, 
                              [CallerFilePath] </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> source </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">""</span><span style="color: #000000;">, 
                              [CallerMemberName] </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> method </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">""</span><span style="color: #000000;">)
        {
            </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (IsEnabled())
            {
                TraceInfo(RoleEnvironment.CurrentRoleInstance.Role.Name,
                          RoleEnvironment.CurrentRoleInstance.Id,
                          description,
                          source,
                          method);
            }
        }

        [NonEvent]
        </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">void</span><span style="color: #000000;"> TraceError(</span><span style="color: #0000FF;">string</span><span style="color: #000000;"> exception, 
                               </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> innerException,
                               [CallerFilePath] </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> source </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">""</span><span style="color: #000000;">, 
                               [CallerMemberName] </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> method </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">""</span><span style="color: #000000;">)
        {
            </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (</span><span style="color: #0000FF;">string</span><span style="color: #000000;">.IsNullOrWhiteSpace(exception))
            {
                </span><span style="color: #0000FF;">return</span><span style="color: #000000;">;
            }
            </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (IsEnabled())
            {
                TraceError(RoleEnvironment.CurrentRoleInstance.Role.Name,
                           RoleEnvironment.CurrentRoleInstance.Id,
                           Guid.NewGuid(),
                           exception, 
                           </span><span style="color: #0000FF;">string</span><span style="color: #000000;">.IsNullOrWhiteSpace(innerException) </span><span style="color: #000000;">?</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;">.Empty : innerException,
                           source,
                           method);
            }
        }

       [NonEvent]
        </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">void</span><span style="color: #000000;"> OpenPartition(</span><span style="color: #0000FF;">string</span><span style="color: #000000;"> eventHub, 
                                  </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> consumerGroup, 
                                  </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> partitionId,
                                  [CallerFilePath] </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> source </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">""</span><span style="color: #000000;">,
                                  [CallerMemberName] </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> method </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">""</span><span style="color: #000000;">)
        {
            </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (</span><span style="color: #0000FF;">string</span><span style="color: #000000;">.IsNullOrWhiteSpace(eventHub) </span><span style="color: #000000;">||</span><span style="color: #000000;">
                </span><span style="color: #0000FF;">string</span><span style="color: #000000;">.IsNullOrWhiteSpace(consumerGroup) </span><span style="color: #000000;">||</span><span style="color: #000000;">
                </span><span style="color: #0000FF;">string</span><span style="color: #000000;">.IsNullOrWhiteSpace(partitionId))
            {
                </span><span style="color: #0000FF;">return</span><span style="color: #000000;">;
            }
            </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (IsEnabled())
            {
                OpenPartition(RoleEnvironment.CurrentRoleInstance.Role.Name,
                              RoleEnvironment.CurrentRoleInstance.Id,
                              eventHub,
                              consumerGroup,
                              partitionId,
                              source,
                              method);
            }
        }

        [NonEvent]
       </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">void</span><span style="color: #000000;"> ClosePartition(</span><span style="color: #0000FF;">string</span><span style="color: #000000;"> eventHub, 
                                  </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> consumerGroup, 
                                  </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> partitionId,
                                  </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> reason,
                                  [CallerFilePath] </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> source </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">""</span><span style="color: #000000;">,
                                  [CallerMemberName] </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> method </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">""</span><span style="color: #000000;">)
        {
            </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (</span><span style="color: #0000FF;">string</span><span style="color: #000000;">.IsNullOrWhiteSpace(eventHub) </span><span style="color: #000000;">||</span><span style="color: #000000;">
                </span><span style="color: #0000FF;">string</span><span style="color: #000000;">.IsNullOrWhiteSpace(consumerGroup) </span><span style="color: #000000;">||</span><span style="color: #000000;">
                </span><span style="color: #0000FF;">string</span><span style="color: #000000;">.IsNullOrWhiteSpace(partitionId))
            {
                </span><span style="color: #0000FF;">return</span><span style="color: #000000;">;
            }
            </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (IsEnabled())
            {
                ClosePartition(RoleEnvironment.CurrentRoleInstance.Role.Name,
                               RoleEnvironment.CurrentRoleInstance.Id,
                               eventHub,
                               consumerGroup,
                               partitionId,
                               reason,
                               source,
                               method);
            }
        }

        [NonEvent]
        </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">void</span><span style="color: #000000;"> ProcessEvents(</span><span style="color: #0000FF;">string</span><span style="color: #000000;"> eventHub, 
                                  </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> consumerGroup, 
                                  </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> partitionId, 
                                  </span><span style="color: #0000FF;">int</span><span style="color: #000000;"> messageCount,
                                  [CallerFilePath] </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> source </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">""</span><span style="color: #000000;">,
                                  [CallerMemberName] </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> method </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">""</span><span style="color: #000000;">)
        {
            </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (</span><span style="color: #0000FF;">string</span><span style="color: #000000;">.IsNullOrWhiteSpace(eventHub) </span><span style="color: #000000;">||</span><span style="color: #000000;">
                </span><span style="color: #0000FF;">string</span><span style="color: #000000;">.IsNullOrWhiteSpace(consumerGroup) </span><span style="color: #000000;">||</span><span style="color: #000000;">
                </span><span style="color: #0000FF;">string</span><span style="color: #000000;">.IsNullOrWhiteSpace(partitionId))
            {
                </span><span style="color: #0000FF;">return</span><span style="color: #000000;">;
            }
            </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (IsEnabled())
            {
                ProcessEvents(RoleEnvironment.CurrentRoleInstance.Role.Name,
                              RoleEnvironment.CurrentRoleInstance.Id,
                              eventHub,
                              consumerGroup,
                              partitionId,
                              messageCount,
                              source,
                              method);
            }
        }

        </span><span style="color: #0000FF;">#endregion</span><span style="color: #000000;">
    }
}</span></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --></div>

<div class="endscriptcode"><strong>EventProcessorHostWorkerRole</strong></div>

<div class="endscriptcode">The following table contains the code of the WorkerRole class. The class reads the following settings from the service configuration file and then create an instance of the <strong>EventProcessorHost </strong>class:</div>

<p>&#160;</p>

<ul>
  <li>Connectionstring of the Azure SQL Database where to store events. </li>

  <li>Connectionstring of the Service Bus namespace hsoting the event hub used by the solution. </li>

  <li>Connectionstring of the storage account used by the <strong>EventProcessorHost</strong>. </li>

  <li>The name of the event hub. </li>

  <li>The name of the consumer group used by the worker role to read events from the event hub. </li>
</ul>

<div id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:051d6ac2-2efd-41a8-8c1a-68a01dd8555a" class="wlWriterEditableSmartContent" style="margin: 0px; padding: 0px; float: none; display: inline;"><pre style="background-color:#FFFFFF;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;overflow: auto;"><span style="color: #0000FF;">#region</span><span style="color: #000000;"> Using Directives</span><span style="color: #000000;">
</span><span style="color: #0000FF;">using</span><span style="color: #000000;"> System;
</span><span style="color: #0000FF;">using</span><span style="color: #000000;"> System.Linq;
</span><span style="color: #0000FF;">using</span><span style="color: #000000;"> System.Net;
</span><span style="color: #0000FF;">using</span><span style="color: #000000;"> System.Threading;
</span><span style="color: #0000FF;">using</span><span style="color: #000000;"> System.Threading.Tasks;
</span><span style="color: #0000FF;">using</span><span style="color: #000000;"> Microsoft.ServiceBus.Messaging;
</span><span style="color: #0000FF;">using</span><span style="color: #000000;"> Microsoft.WindowsAzure.ServiceRuntime;
</span><span style="color: #0000FF;">using</span><span style="color: #000000;"> Microsoft.AzureCat.Samples.Helpers;
</span><span style="color: #0000FF;">#endregion</span><span style="color: #000000;">

</span><span style="color: #0000FF;">namespace</span><span style="color: #000000;"> Microsoft.AzureCat.Samples.EventProcessorHostWorkerRole
{
    </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">class</span><span style="color: #000000;"> WorkerRole : RoleEntryPoint
    {
        </span><span style="color: #0000FF;">#region</span><span style="color: #000000;"> Private Constants</span><span style="color: #000000;">
        </span><span style="color: #008000;">//</span><span style="color: #008000;">*******************************
        </span><span style="color: #008000;">//</span><span style="color: #008000;"> Messages &amp; Formats
        </span><span style="color: #008000;">//</span><span style="color: #008000;">*******************************</span><span style="color: #008000;">
</span><span style="color: #000000;">        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> RoleEnvironmentSettingFormat </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">Configuration Setting [{0}] = [{1}].</span><span style="color: #800000;">"</span><span style="color: #000000;">;
        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> RoleEnvironmentConfigurationSettingChangedFormat </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">The setting [{0}] is changed: new value = [{1}].</span><span style="color: #800000;">"</span><span style="color: #000000;">;
        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> RoleEnvironmentConfigurationSettingChangingFormat </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">The setting [{0}] is changing: old value = [{1}].</span><span style="color: #800000;">"</span><span style="color: #000000;">;
        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> RoleEnvironmentTopologyChangedFormat </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">The  topology for the [{0}] role is changed.</span><span style="color: #800000;">"</span><span style="color: #000000;">;
        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> RoleEnvironmentTopologyChangingFormat </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">The  topology for the [{0}] role is changing.</span><span style="color: #800000;">"</span><span style="color: #000000;">;
        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> RoleInstanceCountFormat </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">[Role {0}] instance count = [{1}].</span><span style="color: #800000;">"</span><span style="color: #000000;">;
        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> RoleInstanceEndpointCountFormat </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">[Role {0}] instance endpoints count = [{1}].</span><span style="color: #800000;">"</span><span style="color: #000000;">;
        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> RoleInstanceEndpointFormat </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">[Role {0}] instance endpoint [{1}]: protocol = [{2}] address = [{3}] port = [{4}].</span><span style="color: #800000;">"</span><span style="color: #000000;">;
        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> RoleInstanceIdFormat </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">[Role {0}] instance Id = [{1}].</span><span style="color: #800000;">"</span><span style="color: #000000;">;
        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> RoleInstanceStatusFormat </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">[Role {0}] instance Id = [{1}] Status = [{2}].</span><span style="color: #800000;">"</span><span style="color: #000000;">;
        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> Unknown </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">Unknown</span><span style="color: #800000;">"</span><span style="color: #000000;">;
        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> RegisteringEventProcessor </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">Registering Event Processor [EventProcessor]... </span><span style="color: #800000;">"</span><span style="color: #000000;">;
        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> EventProcessorRegistered </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">Event Processor [EventProcessor] successfully registered. </span><span style="color: #800000;">"</span><span style="color: #000000;">;

        </span><span style="color: #008000;">//</span><span style="color: #008000;">*******************************
        </span><span style="color: #008000;">//</span><span style="color: #008000;"> Settings
        </span><span style="color: #008000;">//</span><span style="color: #008000;">*******************************</span><span style="color: #008000;">
</span><span style="color: #000000;">        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> SqlDatabaseConnectionStringSetting </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">SqlDatabaseConnectionString</span><span style="color: #800000;">"</span><span style="color: #000000;">;
        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> StorageAccountConnectionStringSetting </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">StorageAccountConnectionString</span><span style="color: #800000;">"</span><span style="color: #000000;">;
        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> ServiceBusConnectionStringSetting </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">ServiceBusConnectionString</span><span style="color: #800000;">"</span><span style="color: #000000;">;
        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> EventHubNameSetting </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">EventHubName</span><span style="color: #800000;">"</span><span style="color: #000000;">;
        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> ConsumerGroupNameSetting </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">ConsumerGroupName</span><span style="color: #800000;">"</span><span style="color: #000000;">;
        </span><span style="color: #0000FF;">#endregion</span><span style="color: #000000;">

        </span><span style="color: #0000FF;">#region</span><span style="color: #000000;"> Private Fields</span><span style="color: #000000;">
        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> eventHubName;
        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> consumerGroupName;
        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> sqlDatabaseConnectionString;
        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> storageAccountConnectionString;
        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> serviceBusConnectionString;
        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> EventProcessorHost eventProcessorHost;
        </span><span style="color: #0000FF;">#endregion</span><span style="color: #000000;">

        </span><span style="color: #0000FF;">#region</span><span style="color: #000000;"> Public Methods</span><span style="color: #000000;">
        </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">override</span><span style="color: #000000;"> </span><span style="color: #0000FF;">void</span><span style="color: #000000;"> Run()
        {
            </span><span style="color: #0000FF;">try</span><span style="color: #000000;">
            {
                </span><span style="color: #008000;">//</span><span style="color: #008000;"> TraceIn</span><span style="color: #008000;">
</span><span style="color: #000000;">                TraceEventSource.Log.TraceIn();
                
                </span><span style="color: #0000FF;">while</span><span style="color: #000000;"> (</span><span style="color: #0000FF;">true</span><span style="color: #000000;">)
                {
                    Thread.Sleep(</span><span style="color: #800080;">10000</span><span style="color: #000000;">);
                }
                </span><span style="color: #008000;">//</span><span style="color: #008000;"> ReSharper disable once FunctionNeverReturns</span><span style="color: #008000;">
</span><span style="color: #000000;">            }
            </span><span style="color: #0000FF;">catch</span><span style="color: #000000;"> (Exception ex)
            {
                </span><span style="color: #008000;">//</span><span style="color: #008000;"> Trace Exception</span><span style="color: #008000;">
</span><span style="color: #000000;">                TraceEventSource.Log.TraceError(ex.Message, 
                                                   ex.InnerException </span><span style="color: #000000;">!=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">null</span><span style="color: #000000;"> </span><span style="color: #000000;">?</span><span style="color: #000000;">
                                                   ex.InnerException.Message :
                                                   </span><span style="color: #0000FF;">string</span><span style="color: #000000;">.Empty);
            }
            </span><span style="color: #0000FF;">finally</span><span style="color: #000000;">
            {
                </span><span style="color: #008000;">//</span><span style="color: #008000;"> TraceOut</span><span style="color: #008000;">
</span><span style="color: #000000;">                TraceEventSource.Log.TraceOut();
            }
        }

        </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">override</span><span style="color: #000000;"> </span><span style="color: #0000FF;">bool</span><span style="color: #000000;"> OnStart()
        {
            </span><span style="color: #0000FF;">try</span><span style="color: #000000;">
            {
                </span><span style="color: #008000;">//</span><span style="color: #008000;"> TraceIn</span><span style="color: #008000;">
</span><span style="color: #000000;">                TraceEventSource.Log.TraceIn();

                </span><span style="color: #008000;">//</span><span style="color: #008000;"> Set Default values for the ServicePointManager</span><span style="color: #008000;">
</span><span style="color: #000000;">                ServicePointManager.DefaultConnectionLimit </span><span style="color: #000000;">=</span><span style="color: #000000;"> Environment.ProcessorCount </span><span style="color: #000000;">*</span><span style="color: #000000;"> </span><span style="color: #800080;">120</span><span style="color: #000000;">;
                ServicePointManager.UseNagleAlgorithm </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">false</span><span style="color: #000000;">;
                ServicePointManager.Expect100Continue </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">false</span><span style="color: #000000;">;

                </span><span style="color: #008000;">//</span><span style="color: #008000;"> Setting RoleEnvironment event handlers</span><span style="color: #008000;">
</span><span style="color: #000000;">                RoleEnvironment.Changed </span><span style="color: #000000;">+=</span><span style="color: #000000;"> RoleEnvironment_Changed;
                RoleEnvironment.Changing </span><span style="color: #000000;">+=</span><span style="color: #000000;"> RoleEnvironment_Changing;
                RoleEnvironment.StatusCheck </span><span style="color: #000000;">+=</span><span style="color: #000000;"> RoleEnvironment_StatusCheck;
                RoleEnvironment.Stopping </span><span style="color: #000000;">+=</span><span style="color: #000000;"> RoleEnvironment_Stopping;

                </span><span style="color: #008000;">//</span><span style="color: #008000;"> Read Configuration Settings</span><span style="color: #008000;">
</span><span style="color: #000000;">                ReadConfigurationSettings();

                </span><span style="color: #008000;">//</span><span style="color: #008000;"> Start Event Processor</span><span style="color: #008000;">
</span><span style="color: #000000;">                StartEventProcessorAsync().Wait();

                </span><span style="color: #008000;">//</span><span style="color: #008000;"> Run base.OnStart method</span><span style="color: #008000;">
</span><span style="color: #000000;">                </span><span style="color: #0000FF;">return</span><span style="color: #000000;"> </span><span style="color: #0000FF;">base</span><span style="color: #000000;">.OnStart();
            }
            </span><span style="color: #0000FF;">catch</span><span style="color: #000000;"> (Exception ex)
            {
                </span><span style="color: #008000;">//</span><span style="color: #008000;"> Trace Exception</span><span style="color: #008000;">
</span><span style="color: #000000;">                TraceEventSource.Log.TraceError(ex.Message,
                                                   ex.InnerException </span><span style="color: #000000;">!=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">null</span><span style="color: #000000;"> </span><span style="color: #000000;">?</span><span style="color: #000000;">
                                                   ex.InnerException.Message :
                                                   </span><span style="color: #0000FF;">string</span><span style="color: #000000;">.Empty);
                </span><span style="color: #0000FF;">return</span><span style="color: #000000;"> </span><span style="color: #0000FF;">false</span><span style="color: #000000;">;
            }
            </span><span style="color: #0000FF;">finally</span><span style="color: #000000;">
            {
                </span><span style="color: #008000;">//</span><span style="color: #008000;"> TraceOut</span><span style="color: #008000;">
</span><span style="color: #000000;">                TraceEventSource.Log.TraceOut();
            }
        }
        </span><span style="color: #0000FF;">#endregion</span><span style="color: #000000;">

        </span><span style="color: #0000FF;">#region</span><span style="color: #000000;"> Private Methods</span><span style="color: #000000;">

        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">void</span><span style="color: #000000;"> ReadConfigurationSettings()
        {
            </span><span style="color: #008000;">//</span><span style="color: #008000;"> Read sql database connectionstring setting  </span><span style="color: #008000;">
</span><span style="color: #000000;">            sqlDatabaseConnectionString </span><span style="color: #000000;">=</span><span style="color: #000000;"> CloudConfigurationHelper.GetSetting(SqlDatabaseConnectionStringSetting);
            TraceEventSource.Log.TraceInfo(</span><span style="color: #0000FF;">string</span><span style="color: #000000;">.Format(RoleEnvironmentSettingFormat,
                                                        SqlDatabaseConnectionStringSetting,
                                                        sqlDatabaseConnectionString));

            </span><span style="color: #008000;">//</span><span style="color: #008000;"> Read storage account connectionstring setting  </span><span style="color: #008000;">
</span><span style="color: #000000;">            storageAccountConnectionString </span><span style="color: #000000;">=</span><span style="color: #000000;"> CloudConfigurationHelper.GetSetting(StorageAccountConnectionStringSetting);
            TraceEventSource.Log.TraceInfo(</span><span style="color: #0000FF;">string</span><span style="color: #000000;">.Format(RoleEnvironmentSettingFormat,
                                                        StorageAccountConnectionStringSetting,
                                                        storageAccountConnectionString));

            </span><span style="color: #008000;">//</span><span style="color: #008000;"> Read service bus connectionstring setting  </span><span style="color: #008000;">
</span><span style="color: #000000;">            serviceBusConnectionString </span><span style="color: #000000;">=</span><span style="color: #000000;"> CloudConfigurationHelper.GetSetting(ServiceBusConnectionStringSetting);
            TraceEventSource.Log.TraceInfo(</span><span style="color: #0000FF;">string</span><span style="color: #000000;">.Format(RoleEnvironmentSettingFormat,
                                                        ServiceBusConnectionStringSetting,
                                                        serviceBusConnectionString));
            
            </span><span style="color: #008000;">//</span><span style="color: #008000;"> Read event hub name setting</span><span style="color: #008000;">
</span><span style="color: #000000;">            eventHubName </span><span style="color: #000000;">=</span><span style="color: #000000;"> CloudConfigurationHelper.GetSetting(EventHubNameSetting);
            TraceEventSource.Log.TraceInfo(</span><span style="color: #0000FF;">string</span><span style="color: #000000;">.Format(RoleEnvironmentSettingFormat,
                                                        ServiceBusConnectionStringSetting,
                                                        serviceBusConnectionString));

            </span><span style="color: #008000;">//</span><span style="color: #008000;"> Read event consumer group name setting</span><span style="color: #008000;">
</span><span style="color: #000000;">            consumerGroupName </span><span style="color: #000000;">=</span><span style="color: #000000;"> CloudConfigurationHelper.GetSetting(ConsumerGroupNameSetting);
            TraceEventSource.Log.TraceInfo(</span><span style="color: #0000FF;">string</span><span style="color: #000000;">.Format(RoleEnvironmentSettingFormat,
                                                        ServiceBusConnectionStringSetting,
                                                        serviceBusConnectionString));
        }

        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> async Task StartEventProcessorAsync()
        {
            </span><span style="color: #0000FF;">try</span><span style="color: #000000;">
            {
                </span><span style="color: #008000;">//</span><span style="color: #008000;"> TraceIn</span><span style="color: #008000;">
</span><span style="color: #000000;">                TraceEventSource.Log.TraceIn();
                var eventHubClient </span><span style="color: #000000;">=</span><span style="color: #000000;"> EventHubClient.CreateFromConnectionString(serviceBusConnectionString, eventHubName);

                </span><span style="color: #008000;">//</span><span style="color: #008000;"> Get the default Consumer Group</span><span style="color: #008000;">
</span><span style="color: #000000;">                eventProcessorHost </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> EventProcessorHost(RoleEnvironment.CurrentRoleInstance.Id,
                                                            eventHubClient.Path.ToLower(),
                                                            consumerGroupName.ToLower(),
                                                            serviceBusConnectionString,
                                                            storageAccountConnectionString)
                {
                    PartitionManagerOptions </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> PartitionManagerOptions
                    {
                        AcquireInterval </span><span style="color: #000000;">=</span><span style="color: #000000;"> TimeSpan.FromSeconds(</span><span style="color: #800080;">10</span><span style="color: #000000;">), </span><span style="color: #008000;">//</span><span style="color: #008000;"> Default is 10 seconds</span><span style="color: #008000;">
</span><span style="color: #000000;">                        RenewInterval </span><span style="color: #000000;">=</span><span style="color: #000000;"> TimeSpan.FromSeconds(</span><span style="color: #800080;">10</span><span style="color: #000000;">), </span><span style="color: #008000;">//</span><span style="color: #008000;"> Default is 10 seconds</span><span style="color: #008000;">
</span><span style="color: #000000;">                        LeaseInterval </span><span style="color: #000000;">=</span><span style="color: #000000;"> TimeSpan.FromSeconds(</span><span style="color: #800080;">30</span><span style="color: #000000;">) </span><span style="color: #008000;">//</span><span style="color: #008000;"> Default value is 30 seconds</span><span style="color: #008000;">
</span><span style="color: #000000;">                    }
                };
                TraceEventSource.Log.TraceInfo(RegisteringEventProcessor);
                var eventProcessorOptions </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> EventProcessorOptions
                {
                    InvokeProcessorAfterReceiveTimeout </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">true</span><span style="color: #000000;">,
                    MaxBatchSize </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">100</span><span style="color: #000000;">,
                    PrefetchCount </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">100</span><span style="color: #000000;">,
                    ReceiveTimeOut </span><span style="color: #000000;">=</span><span style="color: #000000;"> TimeSpan.FromSeconds(</span><span style="color: #800080;">30</span><span style="color: #000000;">),
                };
                eventProcessorOptions.ExceptionReceived </span><span style="color: #000000;">+=</span><span style="color: #000000;"> eventProcessorOptions_ExceptionReceived;
                await eventProcessorHost.RegisterEventProcessorFactoryAsync(</span><span style="color: #0000FF;">new</span><span style="color: #000000;"> EventProcessorFactory</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">EventProcessor</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">(sqlDatabaseConnectionString),
                                                                            eventProcessorOptions);
                TraceEventSource.Log.TraceInfo(EventProcessorRegistered);
            }
            </span><span style="color: #0000FF;">catch</span><span style="color: #000000;"> (Exception ex)
            {
                </span><span style="color: #008000;">//</span><span style="color: #008000;"> Trace Exception</span><span style="color: #008000;">
</span><span style="color: #000000;">                TraceEventSource.Log.TraceError(ex.Message,
                                                   ex.InnerException </span><span style="color: #000000;">!=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">null</span><span style="color: #000000;"> </span><span style="color: #000000;">?</span><span style="color: #000000;">
                                                   ex.InnerException.Message :
                                                   </span><span style="color: #0000FF;">string</span><span style="color: #000000;">.Empty);
            }
            </span><span style="color: #0000FF;">finally</span><span style="color: #000000;">
            {
                </span><span style="color: #008000;">//</span><span style="color: #008000;"> TraceOut</span><span style="color: #008000;">
</span><span style="color: #000000;">                TraceEventSource.Log.TraceOut();
            }
        }

        </span><span style="color: #0000FF;">void</span><span style="color: #000000;"> eventProcessorOptions_ExceptionReceived(</span><span style="color: #0000FF;">object</span><span style="color: #000000;"> sender, ExceptionReceivedEventArgs e)
        {
            </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (e </span><span style="color: #000000;">==</span><span style="color: #000000;"> </span><span style="color: #0000FF;">null</span><span style="color: #000000;"> </span><span style="color: #000000;">||</span><span style="color: #000000;"> e.Exception </span><span style="color: #000000;">==</span><span style="color: #000000;"> </span><span style="color: #0000FF;">null</span><span style="color: #000000;">)
            {
                </span><span style="color: #0000FF;">return</span><span style="color: #000000;">;
            }

            </span><span style="color: #008000;">//</span><span style="color: #008000;"> Trace Exception</span><span style="color: #008000;">
</span><span style="color: #000000;">            TraceEventSource.Log.TraceError(e.Exception.Message,
                                            e.Exception.InnerException </span><span style="color: #000000;">!=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">null</span><span style="color: #000000;"> </span><span style="color: #000000;">?</span><span style="color: #000000;">
                                            e.Exception.InnerException.Message :
                                            </span><span style="color: #0000FF;">string</span><span style="color: #000000;">.Empty);
        }

        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;summary&gt;</span><span style="color: #008000;">
        </span><span style="color: #808080;">///</span><span style="color: #008000;"> Occurs after a change to the service configuration is applied to the running instances of a role.
        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;/summary&gt;</span><span style="color: #008000;">
        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;param name="sender"&gt;</span><span style="color: #008000;">The source of the event.</span><span style="color: #808080;">&lt;/param&gt;</span><span style="color: #008000;">
        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;param name="e"&gt;</span><span style="color: #008000;">Represents the arguments for the Changed event, which occurs after a configuration change has been applied to a role instance.</span><span style="color: #808080;">&lt;/param&gt;</span><span style="color: #808080;">
</span><span style="color: #000000;">        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">static</span><span style="color: #000000;"> </span><span style="color: #0000FF;">void</span><span style="color: #000000;"> RoleEnvironment_Changed(</span><span style="color: #0000FF;">object</span><span style="color: #000000;"> sender, RoleEnvironmentChangedEventArgs e)
        {
            </span><span style="color: #0000FF;">try</span><span style="color: #000000;">
            {
                </span><span style="color: #008000;">//</span><span style="color: #008000;"> TraceIn</span><span style="color: #008000;">
</span><span style="color: #000000;">                TraceEventSource.Log.TraceIn();

                </span><span style="color: #008000;">//</span><span style="color: #008000;"> Get the list of configuration setting changes</span><span style="color: #008000;">
</span><span style="color: #000000;">                var settingChanges </span><span style="color: #000000;">=</span><span style="color: #000000;"> e.Changes.OfType</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">RoleEnvironmentConfigurationSettingChange</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">();

                </span><span style="color: #0000FF;">foreach</span><span style="color: #000000;"> (var settingChange </span><span style="color: #0000FF;">in</span><span style="color: #000000;"> settingChanges)
                {
                    var value </span><span style="color: #000000;">=</span><span style="color: #000000;"> CloudConfigurationHelper.GetSetting(settingChange.ConfigurationSettingName);
                    TraceEventSource.Log.TraceInfo(</span><span style="color: #0000FF;">string</span><span style="color: #000000;">.Format(RoleEnvironmentConfigurationSettingChangedFormat,
                                                                            settingChange.ConfigurationSettingName </span><span style="color: #000000;">??</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;">.Empty,
                                                                            </span><span style="color: #0000FF;">string</span><span style="color: #000000;">.IsNullOrEmpty(value) </span><span style="color: #000000;">?</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;">.Empty : value));
                }

                </span><span style="color: #008000;">//</span><span style="color: #008000;"> Get the list of configuration changes</span><span style="color: #008000;">
</span><span style="color: #000000;">                var topologyChanges </span><span style="color: #000000;">=</span><span style="color: #000000;"> e.Changes.OfType</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">RoleEnvironmentTopologyChange</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">();

                </span><span style="color: #0000FF;">foreach</span><span style="color: #000000;"> (var roleName </span><span style="color: #0000FF;">in</span><span style="color: #000000;"> topologyChanges.Select(topologyChange </span><span style="color: #000000;">=&gt;</span><span style="color: #000000;"> topologyChange.RoleName))
                {
                    TraceEventSource.Log.TraceInfo(</span><span style="color: #0000FF;">string</span><span style="color: #000000;">.Format(RoleEnvironmentTopologyChangedFormat,</span><span style="color: #0000FF;">string</span><span style="color: #000000;">.IsNullOrEmpty(roleName) </span><span style="color: #000000;">?</span><span style="color: #000000;"> Unknown : roleName));
                    </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (</span><span style="color: #0000FF;">string</span><span style="color: #000000;">.IsNullOrEmpty(roleName))
                    {
                        </span><span style="color: #0000FF;">continue</span><span style="color: #000000;">;
                    }
                    var role </span><span style="color: #000000;">=</span><span style="color: #000000;"> RoleEnvironment.Roles[roleName];
                    </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (role </span><span style="color: #000000;">==</span><span style="color: #000000;"> </span><span style="color: #0000FF;">null</span><span style="color: #000000;">)
                    {
                        </span><span style="color: #0000FF;">continue</span><span style="color: #000000;">;
                    }
                    TraceEventSource.Log.TraceInfo(</span><span style="color: #0000FF;">string</span><span style="color: #000000;">.Format(RoleInstanceCountFormat, roleName, role.Instances.Count));
                    </span><span style="color: #0000FF;">foreach</span><span style="color: #000000;"> (var roleInstance </span><span style="color: #0000FF;">in</span><span style="color: #000000;"> role.Instances)
                    {
                        TraceEventSource.Log.TraceInfo(</span><span style="color: #0000FF;">string</span><span style="color: #000000;">.Format(RoleInstanceIdFormat, roleName, roleInstance.Id));
                        TraceEventSource.Log.TraceInfo(</span><span style="color: #0000FF;">string</span><span style="color: #000000;">.Format(RoleInstanceEndpointCountFormat, roleName, roleInstance.InstanceEndpoints.Count));
                        </span><span style="color: #0000FF;">foreach</span><span style="color: #000000;"> (var instanceEndpoint </span><span style="color: #0000FF;">in</span><span style="color: #000000;"> roleInstance.InstanceEndpoints)
                        {
                            TraceEventSource.Log.TraceInfo(</span><span style="color: #0000FF;">string</span><span style="color: #000000;">.Format(RoleInstanceEndpointFormat,
                                                                            roleName,
                                                                            instanceEndpoint.Key,
                                                                            instanceEndpoint.Value.Protocol,
                                                                            instanceEndpoint.Value.IPEndpoint.Address,
                                                                            instanceEndpoint.Value.IPEndpoint.Port));
                        }
                    }
                }
            }
            </span><span style="color: #0000FF;">catch</span><span style="color: #000000;"> (Exception ex)
            {
                </span><span style="color: #008000;">//</span><span style="color: #008000;"> Trace Exception</span><span style="color: #008000;">
</span><span style="color: #000000;">                TraceEventSource.Log.TraceError(ex.Message,
                                                   ex.InnerException </span><span style="color: #000000;">!=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">null</span><span style="color: #000000;"> </span><span style="color: #000000;">?</span><span style="color: #000000;">
                                                   ex.InnerException.Message :
                                                   </span><span style="color: #0000FF;">string</span><span style="color: #000000;">.Empty);
            }
            </span><span style="color: #0000FF;">finally</span><span style="color: #000000;">
            {
                </span><span style="color: #008000;">//</span><span style="color: #008000;"> TraceOut</span><span style="color: #008000;">
</span><span style="color: #000000;">                TraceEventSource.Log.TraceOut();
            }
        }

        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;summary&gt;</span><span style="color: #008000;">
        </span><span style="color: #808080;">///</span><span style="color: #008000;"> Occurs before a change to the service configuration is applied to the running instances of a role. 
        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;/summary&gt;</span><span style="color: #008000;">
        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;param name="sender"&gt;</span><span style="color: #008000;">The source of the event.</span><span style="color: #808080;">&lt;/param&gt;</span><span style="color: #008000;">
        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;param name="e"&gt;</span><span style="color: #008000;">presents the arguments for the Changing event, which occurs before a configuration change is applied to a role instance. </span><span style="color: #808080;">&lt;/param&gt;</span><span style="color: #808080;">
</span><span style="color: #000000;">        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">static</span><span style="color: #000000;"> </span><span style="color: #0000FF;">void</span><span style="color: #000000;"> RoleEnvironment_Changing(</span><span style="color: #0000FF;">object</span><span style="color: #000000;"> sender, RoleEnvironmentChangingEventArgs e)
        {
            </span><span style="color: #0000FF;">try</span><span style="color: #000000;">
            {
                </span><span style="color: #008000;">//</span><span style="color: #008000;"> TraceIn</span><span style="color: #008000;">
</span><span style="color: #000000;">                TraceEventSource.Log.TraceIn();

                </span><span style="color: #008000;">//</span><span style="color: #008000;"> Get the list of configuration setting changes</span><span style="color: #008000;">
</span><span style="color: #000000;">                var settingChanges </span><span style="color: #000000;">=</span><span style="color: #000000;"> e.Changes.OfType</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">RoleEnvironmentConfigurationSettingChange</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">();

                </span><span style="color: #0000FF;">foreach</span><span style="color: #000000;"> (var settingChange </span><span style="color: #0000FF;">in</span><span style="color: #000000;"> settingChanges)
                {
                    var value </span><span style="color: #000000;">=</span><span style="color: #000000;"> CloudConfigurationHelper.GetSetting(settingChange.ConfigurationSettingName);
                    TraceEventSource.Log.TraceInfo(</span><span style="color: #0000FF;">string</span><span style="color: #000000;">.Format(RoleEnvironmentConfigurationSettingChangingFormat,
                                                                    settingChange.ConfigurationSettingName,
                                                                    </span><span style="color: #0000FF;">string</span><span style="color: #000000;">.IsNullOrEmpty(value) </span><span style="color: #000000;">?</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;">.Empty : value));
                }

                </span><span style="color: #008000;">//</span><span style="color: #008000;"> Get the list of configuration changes</span><span style="color: #008000;">
</span><span style="color: #000000;">                var topologyChanges </span><span style="color: #000000;">=</span><span style="color: #000000;"> e.Changes.OfType</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">RoleEnvironmentTopologyChange</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">();

                </span><span style="color: #0000FF;">foreach</span><span style="color: #000000;"> (var roleName </span><span style="color: #0000FF;">in</span><span style="color: #000000;"> topologyChanges.Select(topologyChange </span><span style="color: #000000;">=&gt;</span><span style="color: #000000;"> topologyChange.RoleName))
                {
                    TraceEventSource.Log.TraceInfo(</span><span style="color: #0000FF;">string</span><span style="color: #000000;">.Format(RoleEnvironmentTopologyChangingFormat,
                                                                    </span><span style="color: #0000FF;">string</span><span style="color: #000000;">.IsNullOrEmpty(roleName) </span><span style="color: #000000;">?</span><span style="color: #000000;"> Unknown : roleName));
                    </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (</span><span style="color: #0000FF;">string</span><span style="color: #000000;">.IsNullOrEmpty(roleName))
                    {
                        </span><span style="color: #0000FF;">continue</span><span style="color: #000000;">;
                    }
                    var role </span><span style="color: #000000;">=</span><span style="color: #000000;"> RoleEnvironment.Roles[roleName];
                    </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (role </span><span style="color: #000000;">==</span><span style="color: #000000;"> </span><span style="color: #0000FF;">null</span><span style="color: #000000;">)
                    {
                        </span><span style="color: #0000FF;">continue</span><span style="color: #000000;">;
                    }
                    TraceEventSource.Log.TraceInfo(</span><span style="color: #0000FF;">string</span><span style="color: #000000;">.Format(RoleInstanceCountFormat, roleName, role.Instances.Count));
                    </span><span style="color: #0000FF;">foreach</span><span style="color: #000000;"> (var roleInstance </span><span style="color: #0000FF;">in</span><span style="color: #000000;"> role.Instances)
                    {
                        TraceEventSource.Log.TraceInfo(</span><span style="color: #0000FF;">string</span><span style="color: #000000;">.Format(RoleInstanceIdFormat, roleName, roleInstance.Id));
                        TraceEventSource.Log.TraceInfo(</span><span style="color: #0000FF;">string</span><span style="color: #000000;">.Format(RoleInstanceEndpointCountFormat, roleName, roleInstance.InstanceEndpoints.Count));
                        </span><span style="color: #0000FF;">foreach</span><span style="color: #000000;"> (var instanceEndpoint </span><span style="color: #0000FF;">in</span><span style="color: #000000;"> roleInstance.InstanceEndpoints)
                        {
                            TraceEventSource.Log.TraceInfo(</span><span style="color: #0000FF;">string</span><span style="color: #000000;">.Format(RoleInstanceEndpointFormat,
                                                                            roleName,
                                                                            instanceEndpoint.Key,
                                                                            instanceEndpoint.Value.Protocol,
                                                                            instanceEndpoint.Value.IPEndpoint.Address,
                                                                            instanceEndpoint.Value.IPEndpoint.Port));
                        }
                    }
                }
            }
            </span><span style="color: #0000FF;">catch</span><span style="color: #000000;"> (Exception ex)
            {
                </span><span style="color: #008000;">//</span><span style="color: #008000;"> Trace Exception</span><span style="color: #008000;">
</span><span style="color: #000000;">                TraceEventSource.Log.TraceError(ex.Message,
                                                   ex.InnerException </span><span style="color: #000000;">!=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">null</span><span style="color: #000000;"> </span><span style="color: #000000;">?</span><span style="color: #000000;">
                                                   ex.InnerException.Message :
                                                   </span><span style="color: #0000FF;">string</span><span style="color: #000000;">.Empty);
            }
            </span><span style="color: #0000FF;">finally</span><span style="color: #000000;">
            {
                </span><span style="color: #008000;">//</span><span style="color: #008000;"> TraceOut</span><span style="color: #008000;">
</span><span style="color: #000000;">                TraceEventSource.Log.TraceOut();
            }
        }

        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;summary&gt;</span><span style="color: #008000;">
        </span><span style="color: #808080;">///</span><span style="color: #008000;"> Occurs at a regular interval to indicate the status of a role instance. 
        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;/summary&gt;</span><span style="color: #008000;">
        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;param name="sender"&gt;</span><span style="color: #008000;">The source of the event.</span><span style="color: #808080;">&lt;/param&gt;</span><span style="color: #008000;">
        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;param name="e"&gt;</span><span style="color: #008000;">Represents the arguments for the StatusCheck event, which occurs at a regular interval to indicate the status of a role instance.</span><span style="color: #808080;">&lt;/param&gt;</span><span style="color: #808080;">
</span><span style="color: #000000;">        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">static</span><span style="color: #000000;"> </span><span style="color: #0000FF;">void</span><span style="color: #000000;"> RoleEnvironment_StatusCheck(</span><span style="color: #0000FF;">object</span><span style="color: #000000;"> sender, RoleInstanceStatusCheckEventArgs e)
        {
            </span><span style="color: #0000FF;">try</span><span style="color: #000000;">
            {
                </span><span style="color: #008000;">//</span><span style="color: #008000;"> TraceIn</span><span style="color: #008000;">
</span><span style="color: #000000;">                TraceEventSource.Log.TraceIn();

                </span><span style="color: #008000;">//</span><span style="color: #008000;"> Write Role Instance Status</span><span style="color: #008000;">
</span><span style="color: #000000;">                TraceEventSource.Log.TraceInfo(</span><span style="color: #0000FF;">string</span><span style="color: #000000;">.Format(RoleInstanceStatusFormat,
                                                                RoleEnvironment.CurrentRoleInstance.Role.Name,
                                                                RoleEnvironment.CurrentRoleInstance.Id,
                                                                e.Status));
            }
            </span><span style="color: #0000FF;">catch</span><span style="color: #000000;"> (Exception ex)
            {
                </span><span style="color: #008000;">//</span><span style="color: #008000;"> Trace Exception</span><span style="color: #008000;">
</span><span style="color: #000000;">                TraceEventSource.Log.TraceError(ex.Message,
                                                   ex.InnerException </span><span style="color: #000000;">!=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">null</span><span style="color: #000000;"> </span><span style="color: #000000;">?</span><span style="color: #000000;">
                                                   ex.InnerException.Message :
                                                   </span><span style="color: #0000FF;">string</span><span style="color: #000000;">.Empty);
            }
            </span><span style="color: #0000FF;">finally</span><span style="color: #000000;">
            {
                </span><span style="color: #008000;">//</span><span style="color: #008000;"> TraceOut</span><span style="color: #008000;">
</span><span style="color: #000000;">                TraceEventSource.Log.TraceOut();
            }
        }

        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;summary&gt;</span><span style="color: #008000;">
        </span><span style="color: #808080;">///</span><span style="color: #008000;"> Occurs when a role instance is about to be stopped. 
        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;/summary&gt;</span><span style="color: #008000;">
        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;param name="sender"&gt;</span><span style="color: #008000;">The source of the event.</span><span style="color: #808080;">&lt;/param&gt;</span><span style="color: #008000;">
        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;param name="e"&gt;</span><span style="color: #008000;">Represents the arguments for the Stopping event, which occurs when a role instance is being stopped. </span><span style="color: #808080;">&lt;/param&gt;</span><span style="color: #808080;">
</span><span style="color: #000000;">        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">static</span><span style="color: #000000;"> </span><span style="color: #0000FF;">void</span><span style="color: #000000;"> RoleEnvironment_Stopping(</span><span style="color: #0000FF;">object</span><span style="color: #000000;"> sender, RoleEnvironmentStoppingEventArgs e)
        {
            </span><span style="color: #0000FF;">try</span><span style="color: #000000;">
            {
                </span><span style="color: #008000;">//</span><span style="color: #008000;"> TraceIn</span><span style="color: #008000;">
</span><span style="color: #000000;">                TraceEventSource.Log.TraceIn();
            }
            </span><span style="color: #0000FF;">catch</span><span style="color: #000000;"> (Exception ex)
            {
                </span><span style="color: #008000;">//</span><span style="color: #008000;"> Trace Exception</span><span style="color: #008000;">
</span><span style="color: #000000;">                TraceEventSource.Log.TraceError(ex.Message,
                                                   ex.InnerException </span><span style="color: #000000;">!=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">null</span><span style="color: #000000;"> </span><span style="color: #000000;">?</span><span style="color: #000000;">
                                                   ex.InnerException.Message :
                                                   </span><span style="color: #0000FF;">string</span><span style="color: #000000;">.Empty);
            }
            </span><span style="color: #0000FF;">finally</span><span style="color: #000000;">
            {
                </span><span style="color: #008000;">//</span><span style="color: #008000;"> TraceOut</span><span style="color: #008000;">
</span><span style="color: #000000;">                TraceEventSource.Log.TraceOut();
            }
        }
        </span><span style="color: #0000FF;">#endregion</span><span style="color: #000000;">
    }
}</span></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --></div>

<div class="endscriptcode">The following table contains the code of the <strong>EventProcessor </strong>class. In particular, the <strong>ProcessEventsAsync </strong>method writes events to the Azure SQL Database in a batch mode by invoking the <strong>sp_InsertEvents</strong> stored procedure with a <strong>DataTable </strong>object as input parameter. </div>

<div class="scriptcode">
  <div class="pluginEditHolder" plugincommand="mceScriptCode">
    <div id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:2fa05082-fca5-4331-b5d4-a31460dd7ff5" class="wlWriterEditableSmartContent" style="margin: 0px; padding: 0px; float: none; display: inline;"><pre style="background-color:#FFFFFF;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;overflow: auto;"><span style="color: #0000FF;">#region</span><span style="color: #000000;"> Using Directives</span><span style="color: #000000;">
</span><span style="color: #0000FF;">using</span><span style="color: #000000;"> System;
</span><span style="color: #0000FF;">using</span><span style="color: #000000;"> System.Collections.Generic;
</span><span style="color: #0000FF;">using</span><span style="color: #000000;"> System.Data;
</span><span style="color: #0000FF;">using</span><span style="color: #000000;"> System.Data.SqlClient;
</span><span style="color: #0000FF;">using</span><span style="color: #000000;"> System.Linq;
</span><span style="color: #0000FF;">using</span><span style="color: #000000;"> System.Text;
</span><span style="color: #0000FF;">using</span><span style="color: #000000;"> System.Threading.Tasks;
</span><span style="color: #0000FF;">using</span><span style="color: #000000;"> Microsoft.ServiceBus.Messaging;
</span><span style="color: #0000FF;">using</span><span style="color: #000000;"> Newtonsoft.Json;
</span><span style="color: #0000FF;">using</span><span style="color: #000000;"> Microsoft.AzureCat.Samples.Entities;
</span><span style="color: #0000FF;">using</span><span style="color: #000000;"> Microsoft.AzureCat.Samples.Helpers;
</span><span style="color: #0000FF;">#endregion</span><span style="color: #000000;">

</span><span style="color: #0000FF;">namespace</span><span style="color: #000000;"> Microsoft.AzureCat.Samples.EventProcessorHostWorkerRole
{
    </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">class</span><span style="color: #000000;"> EventProcessor : IEventProcessor
    {
        </span><span style="color: #0000FF;">#region</span><span style="color: #000000;"> Private Constants</span><span style="color: #000000;">
        </span><span style="color: #008000;">//</span><span style="color: #008000;">*******************************
        </span><span style="color: #008000;">//</span><span style="color: #008000;"> Messages &amp; Formats
        </span><span style="color: #008000;">//</span><span style="color: #008000;">*******************************</span><span style="color: #008000;">
</span><span style="color: #000000;">        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> RoleEnvironmentSettingFormat </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">Configuration Setting [{0}] = [{1}].</span><span style="color: #800000;">"</span><span style="color: #000000;">;

        </span><span style="color: #008000;">//</span><span style="color: #008000;">*******************************
        </span><span style="color: #008000;">//</span><span style="color: #008000;"> Settings
        </span><span style="color: #008000;">//</span><span style="color: #008000;">*******************************</span><span style="color: #008000;">
</span><span style="color: #000000;">        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> SqlDatabaseConnectionStringSetting </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">SqlDatabaseConnectionString</span><span style="color: #800000;">"</span><span style="color: #000000;">;

        </span><span style="color: #008000;">//</span><span style="color: #008000;">*******************************
        </span><span style="color: #008000;">//</span><span style="color: #008000;"> Columns &amp; Commands &amp; Parameters
        </span><span style="color: #008000;">//</span><span style="color: #008000;">*******************************</span><span style="color: #008000;">
</span><span style="color: #000000;">        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> EventId </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">EventId</span><span style="color: #800000;">"</span><span style="color: #000000;">;
        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> DeviceId </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">DeviceId</span><span style="color: #800000;">"</span><span style="color: #000000;">;
        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> Value </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">Value</span><span style="color: #800000;">"</span><span style="color: #000000;">;
        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> Timestamp </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">Timestamp</span><span style="color: #800000;">"</span><span style="color: #000000;">;
        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> InsertEventsStoreProcedure </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">sp_InsertEvents</span><span style="color: #800000;">"</span><span style="color: #000000;">;
        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> EventsParameter </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">@Events</span><span style="color: #800000;">"</span><span style="color: #000000;">;
        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> TableType </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">EventTableType</span><span style="color: #800000;">"</span><span style="color: #000000;">;
        </span><span style="color: #0000FF;">#endregion</span><span style="color: #000000;">

        </span><span style="color: #0000FF;">#region</span><span style="color: #000000;"> Private Fields</span><span style="color: #000000;">
        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">readonly</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> sqlDatabaseConnectionString;
        </span><span style="color: #0000FF;">#endregion</span><span style="color: #000000;">

        </span><span style="color: #0000FF;">#region</span><span style="color: #000000;"> Public Constructors</span><span style="color: #000000;">

        </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> EventProcessor()
        {
            </span><span style="color: #008000;">//</span><span style="color: #008000;"> Read sql database connectionstring setting  </span><span style="color: #008000;">
</span><span style="color: #000000;">            sqlDatabaseConnectionString </span><span style="color: #000000;">=</span><span style="color: #000000;"> CloudConfigurationHelper.GetSetting(SqlDatabaseConnectionStringSetting);
            TraceEventSource.Log.TraceInfo(</span><span style="color: #0000FF;">string</span><span style="color: #000000;">.Format(RoleEnvironmentSettingFormat,
                                                         SqlDatabaseConnectionStringSetting,
                                                         sqlDatabaseConnectionString));
        }

        </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> EventProcessor(</span><span style="color: #0000FF;">string</span><span style="color: #000000;"> sqlDatabaseConnectionString)
        {
            </span><span style="color: #0000FF;">this</span><span style="color: #000000;">.sqlDatabaseConnectionString </span><span style="color: #000000;">=</span><span style="color: #000000;"> sqlDatabaseConnectionString;
        }
        </span><span style="color: #0000FF;">#endregion</span><span style="color: #000000;">

        </span><span style="color: #0000FF;">#region</span><span style="color: #000000;"> IEventProcessor Methods</span><span style="color: #000000;">
        </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> Task OpenAsync(PartitionContext context)
        {
            </span><span style="color: #0000FF;">try</span><span style="color: #000000;">
            {
                </span><span style="color: #008000;">//</span><span style="color: #008000;"> TraceIn</span><span style="color: #008000;">
</span><span style="color: #000000;">                TraceEventSource.Log.TraceIn();

                </span><span style="color: #008000;">//</span><span style="color: #008000;"> Trace Open Partition</span><span style="color: #008000;">
</span><span style="color: #000000;">                TraceEventSource.Log.OpenPartition(context.EventHubPath,
                                                   context.ConsumerGroupName,
                                                   context.Lease.PartitionId);
            }
            </span><span style="color: #0000FF;">catch</span><span style="color: #000000;"> (Exception ex)
            {
                </span><span style="color: #008000;">//</span><span style="color: #008000;"> Trace Exception</span><span style="color: #008000;">
</span><span style="color: #000000;">                TraceEventSource.Log.TraceError(ex.Message, 
                                                ex.InnerException </span><span style="color: #000000;">!=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">null</span><span style="color: #000000;"> </span><span style="color: #000000;">?</span><span style="color: #000000;">
                                                ex.InnerException.Message :
                                                </span><span style="color: #0000FF;">string</span><span style="color: #000000;">.Empty);
            }
            </span><span style="color: #0000FF;">finally</span><span style="color: #000000;">
            {
                </span><span style="color: #008000;">//</span><span style="color: #008000;"> TraceOut</span><span style="color: #008000;">
</span><span style="color: #000000;">                TraceEventSource.Log.TraceOut();
            }
            </span><span style="color: #0000FF;">return</span><span style="color: #000000;"> Task.FromResult</span><span style="color: #000000;">&lt;</span><span style="color: #0000FF;">object</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">(</span><span style="color: #0000FF;">null</span><span style="color: #000000;">);
        }

        </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> async Task ProcessEventsAsync(PartitionContext context, IEnumerable</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">EventData</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"> events)
        {
            </span><span style="color: #0000FF;">try</span><span style="color: #000000;">
            {
                </span><span style="color: #008000;">//</span><span style="color: #008000;"> TraceIn</span><span style="color: #008000;">
</span><span style="color: #000000;">                TraceEventSource.Log.TraceIn();

                </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (events </span><span style="color: #000000;">==</span><span style="color: #000000;"> </span><span style="color: #0000FF;">null</span><span style="color: #000000;">)
                {
                    </span><span style="color: #0000FF;">return</span><span style="color: #000000;">;
                }
                var eventDataList </span><span style="color: #000000;">=</span><span style="color: #000000;"> events </span><span style="color: #0000FF;">as</span><span style="color: #000000;"> IList</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">EventData</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"> </span><span style="color: #000000;">??</span><span style="color: #000000;"> events.ToList();

                </span><span style="color: #008000;">//</span><span style="color: #008000;"> Trace Process Events</span><span style="color: #008000;">
</span><span style="color: #000000;">                TraceEventSource.Log.ProcessEvents(context.EventHubPath,
                                                   context.ConsumerGroupName,
                                                   context.Lease.PartitionId,
                                                   eventDataList.Count);

                </span><span style="color: #0000FF;">using</span><span style="color: #000000;"> (var sqlConnection </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> SqlConnection(sqlDatabaseConnectionString))
                {
                    await sqlConnection.OpenAsync();

                    var table </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> DataTable();

                    </span><span style="color: #008000;">//</span><span style="color: #008000;"> Add columns to the table</span><span style="color: #008000;">
</span><span style="color: #000000;">                    table.Columns.Add(EventId, </span><span style="color: #0000FF;">typeof</span><span style="color: #000000;">(</span><span style="color: #0000FF;">int</span><span style="color: #000000;">));
                    table.Columns.Add(DeviceId, </span><span style="color: #0000FF;">typeof</span><span style="color: #000000;">(</span><span style="color: #0000FF;">int</span><span style="color: #000000;">));
                    table.Columns.Add(Value, </span><span style="color: #0000FF;">typeof</span><span style="color: #000000;">(</span><span style="color: #0000FF;">int</span><span style="color: #000000;">));
                    table.Columns.Add(Timestamp, </span><span style="color: #0000FF;">typeof</span><span style="color: #000000;">(DateTime));

                    </span><span style="color: #008000;">//</span><span style="color: #008000;"> Add rows to the table</span><span style="color: #008000;">
</span><span style="color: #000000;">                    </span><span style="color: #0000FF;">foreach</span><span style="color: #000000;"> (var eventData </span><span style="color: #0000FF;">in</span><span style="color: #000000;"> eventDataList)
                    {
                        </span><span style="color: #008000;">//</span><span style="color: #008000;"> Note: EventData is disposable</span><span style="color: #008000;">
</span><span style="color: #000000;">                        </span><span style="color: #0000FF;">using</span><span style="color: #000000;"> (eventData)
                        {
                            var data </span><span style="color: #000000;">=</span><span style="color: #000000;"> DeserializeEventData(eventData);
                            table.Rows.Add(data.EventId, data.DeviceId, data.Value, data.Timestamp);
                        }
                    }

                    </span><span style="color: #008000;">//</span><span style="color: #008000;"> Create command</span><span style="color: #008000;">
</span><span style="color: #000000;">                    var sqlCommand </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> SqlCommand(InsertEventsStoreProcedure, sqlConnection)
                    {
                        CommandType </span><span style="color: #000000;">=</span><span style="color: #000000;"> CommandType.StoredProcedure
                    };

                    </span><span style="color: #008000;">//</span><span style="color: #008000;"> Add table-valued parameter</span><span style="color: #008000;">
</span><span style="color: #000000;">                    sqlCommand.Parameters.Add(</span><span style="color: #0000FF;">new</span><span style="color: #000000;"> SqlParameter
                        {
                            ParameterName </span><span style="color: #000000;">=</span><span style="color: #000000;"> EventsParameter,
                            SqlDbType </span><span style="color: #000000;">=</span><span style="color: #000000;"> SqlDbType.Structured,
                            TypeName </span><span style="color: #000000;">=</span><span style="color: #000000;"> TableType,
                            Value </span><span style="color: #000000;">=</span><span style="color: #000000;"> table,
                        });

                    </span><span style="color: #008000;">//</span><span style="color: #008000;"> Execute the query</span><span style="color: #008000;">
</span><span style="color: #000000;">                    await sqlCommand.ExecuteNonQueryAsync();
                }
                await context.CheckpointAsync();
            }
            </span><span style="color: #0000FF;">catch</span><span style="color: #000000;"> (Exception ex)
            {
                </span><span style="color: #008000;">//</span><span style="color: #008000;"> Trace Exception</span><span style="color: #008000;">
</span><span style="color: #000000;">                TraceEventSource.Log.TraceError(ex.Message, 
                                                ex.InnerException </span><span style="color: #000000;">!=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">null</span><span style="color: #000000;"> </span><span style="color: #000000;">?</span><span style="color: #000000;">
                                                ex.InnerException.Message :
                                                </span><span style="color: #0000FF;">string</span><span style="color: #000000;">.Empty);
            }
            </span><span style="color: #0000FF;">finally</span><span style="color: #000000;">
            {
                </span><span style="color: #008000;">//</span><span style="color: #008000;"> TraceOut</span><span style="color: #008000;">
</span><span style="color: #000000;">                TraceEventSource.Log.TraceOut();
            }
        }

        </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> async Task CloseAsync(PartitionContext context, CloseReason reason)
        {
            </span><span style="color: #0000FF;">try</span><span style="color: #000000;">
            {
                </span><span style="color: #008000;">//</span><span style="color: #008000;"> TraceIn</span><span style="color: #008000;">
</span><span style="color: #000000;">                TraceEventSource.Log.TraceIn();

                </span><span style="color: #008000;">//</span><span style="color: #008000;"> Trace Open Partition</span><span style="color: #008000;">
</span><span style="color: #000000;">                TraceEventSource.Log.ClosePartition(context.EventHubPath,
                                                    context.ConsumerGroupName,
                                                    context.Lease.PartitionId,
                                                    reason.ToString());

                </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (reason </span><span style="color: #000000;">==</span><span style="color: #000000;"> CloseReason.Shutdown)
                {
                    await context.CheckpointAsync();
                }
            }
            </span><span style="color: #0000FF;">catch</span><span style="color: #000000;"> (Exception ex)
            {
                </span><span style="color: #008000;">//</span><span style="color: #008000;"> Trace Exception</span><span style="color: #008000;">
</span><span style="color: #000000;">                TraceEventSource.Log.TraceError(ex.Message, 
                                                ex.InnerException </span><span style="color: #000000;">!=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">null</span><span style="color: #000000;"> </span><span style="color: #000000;">?</span><span style="color: #000000;">
                                                ex.InnerException.Message :
                                                </span><span style="color: #0000FF;">string</span><span style="color: #000000;">.Empty);
            }
            </span><span style="color: #0000FF;">finally</span><span style="color: #000000;">
            {
                </span><span style="color: #008000;">//</span><span style="color: #008000;"> TraceOut</span><span style="color: #008000;">
</span><span style="color: #000000;">                TraceEventSource.Log.TraceOut();
            }
        }
        </span><span style="color: #0000FF;">#endregion</span><span style="color: #000000;">

        </span><span style="color: #0000FF;">#region</span><span style="color: #000000;"> Private Static Methods</span><span style="color: #000000;">
        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">static</span><span style="color: #000000;"> Payload DeserializeEventData(EventData eventData)
        {
            </span><span style="color: #0000FF;">return</span><span style="color: #000000;"> JsonConvert.DeserializeObject</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">Payload</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">(Encoding.UTF8.GetString(eventData.GetBytes()));
        }
        </span><span style="color: #0000FF;">#endregion</span><span style="color: #000000;">
    }
}</span></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --></div>
  </div>
</div>

<h2 class="endscriptcode">StoreEventsToAzureSqlDatabase</h2>

<div class="endscriptcode">This project defines the cloud service hosting the worker role. The following table contains the service definition file of the cloud service.</div>

<div class="endscriptcode">
  <div class="scriptcode">
    <div class="pluginEditHolder" plugincommand="mceScriptCode">
      <div id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:89ca2606-5844-4f66-ade9-82a82498cf47" class="wlWriterEditableSmartContent" style="margin: 0px; padding: 0px; float: none; display: inline;"><pre style="background-color:#FFFFFF;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;overflow: auto;"><span style="color: #0000FF;">&lt;?</span><span style="color: #FF00FF;">xml version="1.0" encoding="utf-8"</span><span style="color: #0000FF;">?&gt;</span><span style="color: #000000;">
</span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">ServiceDefinition </span><span style="color: #FF0000;">name</span><span style="color: #0000FF;">="StoreEventsToAzureSqlDatabase"</span><span style="color: #FF0000;"> 
                   xmlns</span><span style="color: #0000FF;">="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition"</span><span style="color: #FF0000;"> 
                   schemaVersion</span><span style="color: #0000FF;">="2014-06.2.4"</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
  </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">WorkerRole </span><span style="color: #FF0000;">name</span><span style="color: #0000FF;">="EventProcessorHostWorkerRole"</span><span style="color: #FF0000;"> vmsize</span><span style="color: #0000FF;">="Small"</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
    </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">ConfigurationSettings</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
      </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">Setting </span><span style="color: #FF0000;">name</span><span style="color: #0000FF;">="SqlDatabaseConnectionString"</span><span style="color: #FF0000;"> </span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;">
      </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">Setting </span><span style="color: #FF0000;">name</span><span style="color: #0000FF;">="StorageAccountConnectionString"</span><span style="color: #FF0000;"> </span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;">
      </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">Setting </span><span style="color: #FF0000;">name</span><span style="color: #0000FF;">="ServiceBusConnectionString"</span><span style="color: #FF0000;"> </span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;">
      </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">Setting </span><span style="color: #FF0000;">name</span><span style="color: #0000FF;">="EventHubName"</span><span style="color: #FF0000;"> </span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;">
      </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">Setting </span><span style="color: #FF0000;">name</span><span style="color: #0000FF;">="ConsumerGroupName"</span><span style="color: #FF0000;"> </span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;">
    </span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">ConfigurationSettings</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
    </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">Imports</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
      </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">Import </span><span style="color: #FF0000;">moduleName</span><span style="color: #0000FF;">="RemoteAccess"</span><span style="color: #FF0000;"> </span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;">
      </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">Import </span><span style="color: #FF0000;">moduleName</span><span style="color: #0000FF;">="RemoteForwarder"</span><span style="color: #FF0000;"> </span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;">
    </span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">Imports</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
  </span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">WorkerRole</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
</span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">ServiceDefinition</span><span style="color: #0000FF;">&gt;</span></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --></div>
    </div>
  </div>

  <div class="endscriptcode">The following table contains the service definition file of the cloud service. Make sure to substitute the placeholders with the expected information before deploying the could service to Azure.</div>

  <div id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:b9609e30-931f-4414-a7f4-392264109681" class="wlWriterEditableSmartContent" style="margin: 0px; padding: 0px; float: none; display: inline;"><pre style="background-color:#FFFFFF;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;overflow: auto;"><span style="color: #0000FF;">&lt;?</span><span style="color: #FF00FF;">xml version="1.0" encoding="utf-8"</span><span style="color: #0000FF;">?&gt;</span><span style="color: #000000;">
</span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">ServiceConfiguration </span><span style="color: #FF0000;">serviceName</span><span style="color: #0000FF;">="StoreEventsToAzureSqlDatabase"</span><span style="color: #FF0000;"> 
                      xmlns</span><span style="color: #0000FF;">="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration"</span><span style="color: #FF0000;"> 
                      osFamily</span><span style="color: #0000FF;">="4"</span><span style="color: #FF0000;"> 
                      osVersion</span><span style="color: #0000FF;">="*"</span><span style="color: #FF0000;"> 
                      schemaVersion</span><span style="color: #0000FF;">="2014-06.2.4"</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
  </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">Role </span><span style="color: #FF0000;">name</span><span style="color: #0000FF;">="EventProcessorHostWorkerRole"</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
    </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">Instances </span><span style="color: #FF0000;">count</span><span style="color: #0000FF;">="2"</span><span style="color: #FF0000;"> </span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;">
    </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">ConfigurationSettings</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
      </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">Setting </span><span style="color: #FF0000;">name</span><span style="color: #0000FF;">="SqlDatabaseConnectionString"</span><span style="color: #FF0000;"> value</span><span style="color: #0000FF;">="[AZURE SQL DATABASE CONNECTION STRING]"</span><span style="color: #FF0000;"> </span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;">
      </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">Setting </span><span style="color: #FF0000;">name</span><span style="color: #0000FF;">="StorageAccountConnectionString"</span><span style="color: #FF0000;"> value</span><span style="color: #0000FF;">="[STORAGE ACCOUNT CONNECTION STRING]"</span><span style="color: #FF0000;"> </span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;">
      </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">Setting </span><span style="color: #FF0000;">name</span><span style="color: #0000FF;">="ServiceBusConnectionString"</span><span style="color: #FF0000;"> value</span><span style="color: #0000FF;">="[SERVICE BUS CONNECTION STRING]"</span><span style="color: #FF0000;"> </span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;">
      </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">Setting </span><span style="color: #FF0000;">name</span><span style="color: #0000FF;">="EventHubName"</span><span style="color: #FF0000;"> value</span><span style="color: #0000FF;">="[EVENT HUB NAME]"</span><span style="color: #FF0000;"> </span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;">
      </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">Setting </span><span style="color: #FF0000;">name</span><span style="color: #0000FF;">="ConsumerGroupName"</span><span style="color: #FF0000;"> value</span><span style="color: #0000FF;">="[CONSUMER GROUP NAME]"</span><span style="color: #FF0000;"> </span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;">
      </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">Setting </span><span style="color: #FF0000;">name</span><span style="color: #0000FF;">="Microsoft.WindowsAzure.Plugins.RemoteAccess.Enabled"</span><span style="color: #FF0000;"> value</span><span style="color: #0000FF;">="true"</span><span style="color: #FF0000;"> </span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;">
      </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">Setting </span><span style="color: #FF0000;">name</span><span style="color: #0000FF;">="Microsoft.WindowsAzure.Plugins.RemoteAccess.AccountUsername"</span><span style="color: #FF0000;"> value</span><span style="color: #0000FF;">="..."</span><span style="color: #FF0000;"> </span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;">
      </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">Setting </span><span style="color: #FF0000;">name</span><span style="color: #0000FF;">="Microsoft.WindowsAzure.Plugins.RemoteAccess.AccountEncryptedPassword"</span><span style="color: #FF0000;"> value</span><span style="color: #0000FF;">="..."</span><span style="color: #FF0000;"> </span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;">
      </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">Setting </span><span style="color: #FF0000;">name</span><span style="color: #0000FF;">="Microsoft.WindowsAzure.Plugins.RemoteAccess.AccountExpiration"</span><span style="color: #FF0000;"> value</span><span style="color: #0000FF;">="..."</span><span style="color: #FF0000;"> </span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;">
      </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">Setting </span><span style="color: #FF0000;">name</span><span style="color: #0000FF;">="Microsoft.WindowsAzure.Plugins.RemoteForwarder.Enabled"</span><span style="color: #FF0000;"> value</span><span style="color: #0000FF;">="true"</span><span style="color: #FF0000;"> </span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;">
    </span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">ConfigurationSettings</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
    </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">Certificates</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
      </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">Certificate </span><span style="color: #FF0000;">name</span><span style="color: #0000FF;">="Microsoft.WindowsAzure.Plugins.RemoteAccess.PasswordEncryption"</span><span style="color: #FF0000;"> 
                   thumbprint</span><span style="color: #0000FF;">="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"</span><span style="color: #FF0000;"> 
                   thumbprintAlgorithm</span><span style="color: #0000FF;">="sha1"</span><span style="color: #FF0000;"> </span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;">
    </span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">Certificates</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
  </span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">Role</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
</span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">ServiceConfiguration</span><span style="color: #0000FF;">&gt;</span></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --></div>
</div>

<p style="text-align: justify;">To configure diagnostics configuration and in particular ETW Logs for the worker role, you can proceed as follows: right click on the role and selec <strong>Properties</strong>. On the <strong>Configuration</strong> property page make sure <strong>Enable Diagnostics</strong> is checked and click the <strong>Configure…</strong> button. On the <strong>Diagnostics configuration</strong> dialog go to the <strong>ETW Logs</strong> tab and select <strong>Enable transfer of ETW logs</strong>. Add the appropriate event sources to transfer by specifying the event source name and clicking on the <strong>Add Event Source</strong> button. In the sample, make sure to select the <strong>TraceEventSource</strong> as shown in the picture below.</p>

<p style="text-align: center;"><img id="134619" alt="" src="https://i1.code.msdn.s-msft.com/how-to-integrate-store-828769eb/image/file/134619/1/etw01.png" width="800" /></p>

<p style="text-align: justify;">Then, right click the new row and select <strong>Configure event storage... </strong>menu item. In the <strong>Storage Configuration</strong> dialog, specify the name of the default storage table and, optionally, specify the name of the target table for each EventId defined in the EventSource class. In this sample, all diagnostic messages generated by the <strong>TraceEventSource</strong> class are configured to be traced to the <strong>WADDiagnosticTable </strong>(the prefix WAD is automatically added by Windows Azure Diagnostics), while the logs generated by the EventProcessor class are stored in a separate table called <strong>WADEventProcessorTable</strong>.</p>

<p style="text-align: center;"><img id="134620" alt="" src="https://i1.code.msdn.s-msft.com/how-to-integrate-store-828769eb/image/file/134620/1/etw02.png" width="444" height="394" /></p>

<p style="text-align: justify;">Once added, configure additional properties like the storage location for the logs, the log level, any keyword filters and transfer frequency.</p>

<h2>Sender</h2>

<p>This application can be used to provision the event hub used by the application and simulate a configurable amount of devices.</p>

<p style="text-align: center;"><img id="134601" alt="" src="https://i1.code.msdn.s-msft.com/how-to-integrate-store-828769eb/image/file/134601/1/client.png" width="800" /></p>

<p>The following table shows the configuration file of the application. Make sure to substitute the placeholders with the expected information before running the application.</p>

<div id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:616bc688-9020-49ee-9b36-f0272ef767d1" class="wlWriterEditableSmartContent" style="margin: 0px; padding: 0px; float: none; display: inline;"><pre style="background-color:#FFFFFF;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;overflow: auto;"><span style="color: #0000FF;">&lt;?</span><span style="color: #FF00FF;">xml version="1.0" encoding="utf-8"</span><span style="color: #0000FF;">?&gt;</span><span style="color: #000000;">
</span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">configuration</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
  </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">appSettings</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
    </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">add </span><span style="color: #FF0000;">key</span><span style="color: #0000FF;">="namespace"</span><span style="color: #FF0000;"> value</span><span style="color: #0000FF;">="[SERVICE BUS NAMESPACE]"</span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;">
    </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">add </span><span style="color: #FF0000;">key</span><span style="color: #0000FF;">="keyName"</span><span style="color: #FF0000;"> value</span><span style="color: #0000FF;">="[NAMESPACE LEVEL SAS KEY NAME]"</span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;">
    </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">add </span><span style="color: #FF0000;">key</span><span style="color: #0000FF;">="keyValue"</span><span style="color: #FF0000;"> value</span><span style="color: #0000FF;">="[NAMESPACE LEVEL SAS KEY VALUE]"</span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;">
    </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">add </span><span style="color: #FF0000;">key</span><span style="color: #0000FF;">="eventHub"</span><span style="color: #FF0000;"> value</span><span style="color: #0000FF;">="[EVENT HUB NAME]"</span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;">
    </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">add </span><span style="color: #FF0000;">key</span><span style="color: #0000FF;">="partitionCount"</span><span style="color: #FF0000;"> value</span><span style="color: #0000FF;">="16"</span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;">
    </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">add </span><span style="color: #FF0000;">key</span><span style="color: #0000FF;">="retentionDays"</span><span style="color: #FF0000;"> value</span><span style="color: #0000FF;">="7"</span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;">
    </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">add </span><span style="color: #FF0000;">key</span><span style="color: #0000FF;">="location"</span><span style="color: #FF0000;"> value</span><span style="color: #0000FF;">="Milan"</span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;">
    </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">add </span><span style="color: #FF0000;">key</span><span style="color: #0000FF;">="deviceCount"</span><span style="color: #FF0000;"> value</span><span style="color: #0000FF;">="10"</span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;">
    </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">add </span><span style="color: #FF0000;">key</span><span style="color: #0000FF;">="eventInterval"</span><span style="color: #FF0000;"> value</span><span style="color: #0000FF;">="1"</span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;">
    </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">add </span><span style="color: #FF0000;">key</span><span style="color: #0000FF;">="minValue"</span><span style="color: #FF0000;"> value</span><span style="color: #0000FF;">="20"</span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;">
    </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">add </span><span style="color: #FF0000;">key</span><span style="color: #0000FF;">="maxValue"</span><span style="color: #FF0000;"> value</span><span style="color: #0000FF;">="50"</span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;">
  </span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">appSettings</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
  </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">system.serviceModel</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
    </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">extensions</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
      </span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;"> In this extension section we are introducing all known service bus extensions. User can remove the ones they don't need. </span><span style="color: #008000;">--&gt;</span><span style="color: #000000;">
      </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">behaviorExtensions</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
        </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">add </span><span style="color: #FF0000;">name</span><span style="color: #0000FF;">="connectionStatusBehavior"</span><span style="color: #FF0000;">
          type</span><span style="color: #0000FF;">="Microsoft.ServiceBus.Configuration.ConnectionStatusElement, Microsoft.ServiceBus, Culture=neutral, PublicKeyToken=31bf3856ad364e35"</span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;">
        </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">add </span><span style="color: #FF0000;">name</span><span style="color: #0000FF;">="transportClientEndpointBehavior"</span><span style="color: #FF0000;">
          type</span><span style="color: #0000FF;">="Microsoft.ServiceBus.Configuration.TransportClientEndpointBehaviorElement, Microsoft.ServiceBus, Culture=neutral, PublicKeyToken=31bf3856ad364e35"</span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;">
        </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">add </span><span style="color: #FF0000;">name</span><span style="color: #0000FF;">="serviceRegistrySettings"</span><span style="color: #FF0000;">
          type</span><span style="color: #0000FF;">="Microsoft.ServiceBus.Configuration.ServiceRegistrySettingsElement, Microsoft.ServiceBus, Culture=neutral, PublicKeyToken=31bf3856ad364e35"</span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;">
      </span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">behaviorExtensions</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
      </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">bindingElementExtensions</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
        </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">add </span><span style="color: #FF0000;">name</span><span style="color: #0000FF;">="netMessagingTransport"</span><span style="color: #FF0000;">
          type</span><span style="color: #0000FF;">="Microsoft.ServiceBus.Messaging.Configuration.NetMessagingTransportExtensionElement, Microsoft.ServiceBus,  Culture=neutral, PublicKeyToken=31bf3856ad364e35"</span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;">
        </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">add </span><span style="color: #FF0000;">name</span><span style="color: #0000FF;">="tcpRelayTransport"</span><span style="color: #FF0000;">
          type</span><span style="color: #0000FF;">="Microsoft.ServiceBus.Configuration.TcpRelayTransportElement, Microsoft.ServiceBus, Culture=neutral, PublicKeyToken=31bf3856ad364e35"</span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;">
        </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">add </span><span style="color: #FF0000;">name</span><span style="color: #0000FF;">="httpRelayTransport"</span><span style="color: #FF0000;">
          type</span><span style="color: #0000FF;">="Microsoft.ServiceBus.Configuration.HttpRelayTransportElement, Microsoft.ServiceBus, Culture=neutral, PublicKeyToken=31bf3856ad364e35"</span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;">
        </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">add </span><span style="color: #FF0000;">name</span><span style="color: #0000FF;">="httpsRelayTransport"</span><span style="color: #FF0000;">
          type</span><span style="color: #0000FF;">="Microsoft.ServiceBus.Configuration.HttpsRelayTransportElement, Microsoft.ServiceBus, Culture=neutral, PublicKeyToken=31bf3856ad364e35"</span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;">
        </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">add </span><span style="color: #FF0000;">name</span><span style="color: #0000FF;">="onewayRelayTransport"</span><span style="color: #FF0000;">
          type</span><span style="color: #0000FF;">="Microsoft.ServiceBus.Configuration.RelayedOnewayTransportElement, Microsoft.ServiceBus, Culture=neutral, PublicKeyToken=31bf3856ad364e35"</span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;">
      </span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">bindingElementExtensions</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
      </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">bindingExtensions</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
        </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">add </span><span style="color: #FF0000;">name</span><span style="color: #0000FF;">="basicHttpRelayBinding"</span><span style="color: #FF0000;">
          type</span><span style="color: #0000FF;">="Microsoft.ServiceBus.Configuration.BasicHttpRelayBindingCollectionElement, Microsoft.ServiceBus, Culture=neutral, PublicKeyToken=31bf3856ad364e35"</span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;">
        </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">add </span><span style="color: #FF0000;">name</span><span style="color: #0000FF;">="webHttpRelayBinding"</span><span style="color: #FF0000;">
          type</span><span style="color: #0000FF;">="Microsoft.ServiceBus.Configuration.WebHttpRelayBindingCollectionElement, Microsoft.ServiceBus, Culture=neutral, PublicKeyToken=31bf3856ad364e35"</span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;">
        </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">add </span><span style="color: #FF0000;">name</span><span style="color: #0000FF;">="ws2007HttpRelayBinding"</span><span style="color: #FF0000;">
          type</span><span style="color: #0000FF;">="Microsoft.ServiceBus.Configuration.WS2007HttpRelayBindingCollectionElement, Microsoft.ServiceBus, Culture=neutral, PublicKeyToken=31bf3856ad364e35"</span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;">
        </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">add </span><span style="color: #FF0000;">name</span><span style="color: #0000FF;">="netTcpRelayBinding"</span><span style="color: #FF0000;">
          type</span><span style="color: #0000FF;">="Microsoft.ServiceBus.Configuration.NetTcpRelayBindingCollectionElement, Microsoft.ServiceBus, Culture=neutral, PublicKeyToken=31bf3856ad364e35"</span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;">
        </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">add </span><span style="color: #FF0000;">name</span><span style="color: #0000FF;">="netOnewayRelayBinding"</span><span style="color: #FF0000;">
          type</span><span style="color: #0000FF;">="Microsoft.ServiceBus.Configuration.NetOnewayRelayBindingCollectionElement, Microsoft.ServiceBus, Culture=neutral, PublicKeyToken=31bf3856ad364e35"</span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;">
        </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">add </span><span style="color: #FF0000;">name</span><span style="color: #0000FF;">="netEventRelayBinding"</span><span style="color: #FF0000;">
          type</span><span style="color: #0000FF;">="Microsoft.ServiceBus.Configuration.NetEventRelayBindingCollectionElement, Microsoft.ServiceBus, Culture=neutral, PublicKeyToken=31bf3856ad364e35"</span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;">
        </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">add </span><span style="color: #FF0000;">name</span><span style="color: #0000FF;">="netMessagingBinding"</span><span style="color: #FF0000;">
          type</span><span style="color: #0000FF;">="Microsoft.ServiceBus.Messaging.Configuration.NetMessagingBindingCollectionElement, Microsoft.ServiceBus, Culture=neutral, PublicKeyToken=31bf3856ad364e35"</span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;">
      </span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">bindingExtensions</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
    </span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">extensions</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
  </span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">system.serviceModel</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
</span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">configuration</span><span style="color: #0000FF;">&gt;</span></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --></div>

<div class="endscriptcode">The following table contains the code of the <strong>MainForm</strong> class. Spend a few minutes to analyze the code of the <strong>btnStart_Click</strong> method. This method check creates the event hub if it doesn't exist and creates the SendKey used to create SAS tokens for individual devices. Then the code creates a separate Task for each device. Each Task start sending events using the selected transport (AMQP or HTTPS).</div>

<div class="endscriptcode">
  <div class="scriptcode">
    <div id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:96a68920-6af8-4a2f-8495-d3da470af77a" class="wlWriterEditableSmartContent" style="margin: 0px; padding: 0px; float: none; display: inline;"><pre style="background-color:#FFFFFF;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;overflow: auto;"><span style="color: #0000FF;">#region</span><span style="color: #000000;"> Using Directives</span><span style="color: #000000;">
</span><span style="color: #0000FF;">using</span><span style="color: #000000;"> System;
</span><span style="color: #0000FF;">using</span><span style="color: #000000;"> System.Configuration;
</span><span style="color: #0000FF;">using</span><span style="color: #000000;"> System.Drawing;
</span><span style="color: #0000FF;">using</span><span style="color: #000000;"> System.IO;
</span><span style="color: #0000FF;">using</span><span style="color: #000000;"> System.Linq;
</span><span style="color: #0000FF;">using</span><span style="color: #000000;"> System.Globalization;
</span><span style="color: #0000FF;">using</span><span style="color: #000000;"> System.Net.Http;
</span><span style="color: #0000FF;">using</span><span style="color: #000000;"> System.Security.Cryptography;
</span><span style="color: #0000FF;">using</span><span style="color: #000000;"> System.Text;
</span><span style="color: #0000FF;">using</span><span style="color: #000000;"> System.Threading;
</span><span style="color: #0000FF;">using</span><span style="color: #000000;"> System.Threading.Tasks;
</span><span style="color: #0000FF;">using</span><span style="color: #000000;"> System.Web;
</span><span style="color: #0000FF;">using</span><span style="color: #000000;"> System.Windows.Forms;
</span><span style="color: #0000FF;">using</span><span style="color: #000000;"> Microsoft.ServiceBus;
</span><span style="color: #0000FF;">using</span><span style="color: #000000;"> Microsoft.ServiceBus.Messaging;
</span><span style="color: #0000FF;">using</span><span style="color: #000000;"> Newtonsoft.Json;
</span><span style="color: #0000FF;">using</span><span style="color: #000000;"> Newtonsoft.Json.Linq;
</span><span style="color: #0000FF;">using</span><span style="color: #000000;"> Microsoft.AzureCat.Samples.Entities;
</span><span style="color: #0000FF;">#endregion</span><span style="color: #000000;">

</span><span style="color: #0000FF;">namespace</span><span style="color: #000000;"> Microsoft.AzureCat.Samples.Sender
{
    </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">partial</span><span style="color: #000000;"> </span><span style="color: #0000FF;">class</span><span style="color: #000000;"> MainForm : Form
    {
        </span><span style="color: #0000FF;">#region</span><span style="color: #000000;"> Private Constants</span><span style="color: #000000;">
        </span><span style="color: #008000;">//</span><span style="color: #008000;">***************************
        </span><span style="color: #008000;">//</span><span style="color: #008000;"> Formats
        </span><span style="color: #008000;">//</span><span style="color: #008000;">***************************</span><span style="color: #008000;">
</span><span style="color: #000000;">        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> DateFormat </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">&lt;{0,2:00}:{1,2:00}:{2,2:00}&gt; {3}</span><span style="color: #800000;">"</span><span style="color: #000000;">;
        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> ExceptionFormat </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">Exception: {0}</span><span style="color: #800000;">"</span><span style="color: #000000;">;
        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> InnerExceptionFormat </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">InnerException: {0}</span><span style="color: #800000;">"</span><span style="color: #000000;">;
        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> LogFileNameFormat </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">WADTablesCleaner {0}.txt</span><span style="color: #800000;">"</span><span style="color: #000000;">;

        </span><span style="color: #008000;">//</span><span style="color: #008000;">***************************
        </span><span style="color: #008000;">//</span><span style="color: #008000;"> Constants
        </span><span style="color: #008000;">//</span><span style="color: #008000;">***************************</span><span style="color: #008000;">
</span><span style="color: #000000;">        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> SaveAsTitle </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">Save Log As</span><span style="color: #800000;">"</span><span style="color: #000000;">;
        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> SaveAsExtension </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">txt</span><span style="color: #800000;">"</span><span style="color: #000000;">;
        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> SaveAsFilter </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">Text Documents (*.txt)|*.txt</span><span style="color: #800000;">"</span><span style="color: #000000;">;
        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> Start </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">Start</span><span style="color: #800000;">"</span><span style="color: #000000;">;
        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> Stop </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">Stop</span><span style="color: #800000;">"</span><span style="color: #000000;">;
        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> SenderSharedAccessKey </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">SenderSharedAccessKey</span><span style="color: #800000;">"</span><span style="color: #000000;">;
        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> DeviceId </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">id</span><span style="color: #800000;">"</span><span style="color: #000000;">;
        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> DeviceName </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">name</span><span style="color: #800000;">"</span><span style="color: #000000;">;
        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> DeviceLocation </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">location</span><span style="color: #800000;">"</span><span style="color: #000000;">;
        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> Value </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">value</span><span style="color: #800000;">"</span><span style="color: #000000;">;

        </span><span style="color: #008000;">//</span><span style="color: #008000;">***************************
        </span><span style="color: #008000;">//</span><span style="color: #008000;"> Configuration Parameters
        </span><span style="color: #008000;">//</span><span style="color: #008000;">***************************</span><span style="color: #008000;">
</span><span style="color: #000000;">        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> NamespaceParameter </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">namespace</span><span style="color: #800000;">"</span><span style="color: #000000;">;
        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> KeyNameParameter </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">keyName</span><span style="color: #800000;">"</span><span style="color: #000000;">;
        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> KeyValueParameter </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">keyValue</span><span style="color: #800000;">"</span><span style="color: #000000;">;
        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> EventHubParameter </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">eventHub</span><span style="color: #800000;">"</span><span style="color: #000000;">;
        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> LocationParameter </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">location</span><span style="color: #800000;">"</span><span style="color: #000000;">;
        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> PartitionCountParameter </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">partitionCount</span><span style="color: #800000;">"</span><span style="color: #000000;">;
        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> RetentionDaysParameter </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">retentionDays</span><span style="color: #800000;">"</span><span style="color: #000000;">;
        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> DeviceCountParameter </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">deviceCount</span><span style="color: #800000;">"</span><span style="color: #000000;">;
        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> EventIntervalParameter </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">eventInterval</span><span style="color: #800000;">"</span><span style="color: #000000;">;
        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> MinValueParameter </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">minValue</span><span style="color: #800000;">"</span><span style="color: #000000;">;
        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> MaxValueParameter </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">maxValue</span><span style="color: #800000;">"</span><span style="color: #000000;">;
        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> ApiVersion </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">&amp;api-version=2014-05</span><span style="color: #800000;">"</span><span style="color: #000000;">;

        </span><span style="color: #008000;">//</span><span style="color: #008000;">***************************
        </span><span style="color: #008000;">//</span><span style="color: #008000;"> Configuration Parameters
        </span><span style="color: #008000;">//</span><span style="color: #008000;">***************************</span><span style="color: #008000;">
</span><span style="color: #000000;">        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> DefaultEventHubName </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">SampleEventHub</span><span style="color: #800000;">"</span><span style="color: #000000;">;
        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">int</span><span style="color: #000000;"> DefaultDeviceNumber </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">10</span><span style="color: #000000;">;
        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">int</span><span style="color: #000000;"> DefaultMinValue </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">20</span><span style="color: #000000;">;
        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">int</span><span style="color: #000000;"> DefaultMaxValue </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">50</span><span style="color: #000000;">;
        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">int</span><span style="color: #000000;"> DefaultEventIntervalInSeconds </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">1</span><span style="color: #000000;">;


        </span><span style="color: #008000;">//</span><span style="color: #008000;">***************************
        </span><span style="color: #008000;">//</span><span style="color: #008000;"> Messages
        </span><span style="color: #008000;">//</span><span style="color: #008000;">***************************</span><span style="color: #008000;">
</span><span style="color: #000000;">        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> NamespaceCannonBeNull </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">The Service Bus namespace cannot be null.</span><span style="color: #800000;">"</span><span style="color: #000000;">;
        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> EventHubNameCannonBeNull </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">The event hub name cannot be null.</span><span style="color: #800000;">"</span><span style="color: #000000;">;
        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> KeyNameCannonBeNull </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">The senderKey name cannot be null.</span><span style="color: #800000;">"</span><span style="color: #000000;">;
        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> KeyValueCannonBeNull </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">The senderKey value cannot be null.</span><span style="color: #800000;">"</span><span style="color: #000000;">;
        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> EventHubCreatedOrRetrieved </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">Event hub [{0}] created or retrieved.</span><span style="color: #800000;">"</span><span style="color: #000000;">;
        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> MessagingFactoryCreated </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">Device[{0,3:000}]. MessagingFactory created.</span><span style="color: #800000;">"</span><span style="color: #000000;">;
        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> SasToken </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">Device[{0,3:000}]. SAS Token created.</span><span style="color: #800000;">"</span><span style="color: #000000;">;
        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> EventHubClientCreated </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">Device[{0,3:000}]. EventHubClient created: Path=[{1}].</span><span style="color: #800000;">"</span><span style="color: #000000;">;
        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> HttpClientCreated </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">Device[{0,3:000}]. HttpClient created: BaseAddress=[{1}].</span><span style="color: #800000;">"</span><span style="color: #000000;">;
        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> EventSent </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">Device[{0,3:000}]. Message sent. PartitionKey=[{1}] Value=[{2}]</span><span style="color: #800000;">"</span><span style="color: #000000;">;
        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> SendFailed </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">Device[{0,3:000}]. Message send failed: [{1}]</span><span style="color: #800000;">"</span><span style="color: #000000;">;
        </span><span style="color: #0000FF;">#endregion</span><span style="color: #000000;">

        </span><span style="color: #0000FF;">#region</span><span style="color: #000000;"> Private Fields</span><span style="color: #000000;">
        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> CancellationTokenSource cancellationTokenSource;
        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">int</span><span style="color: #000000;"> eventId;
        </span><span style="color: #0000FF;">#endregion</span><span style="color: #000000;">

        </span><span style="color: #0000FF;">#region</span><span style="color: #000000;"> Public Constructor</span><span style="color: #000000;">
        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;summary&gt;</span><span style="color: #008000;">
        </span><span style="color: #808080;">///</span><span style="color: #008000;"> Initializes a new instance of the MainForm class.
        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;/summary&gt;</span><span style="color: #808080;">
</span><span style="color: #000000;">        </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> MainForm()
        {
            InitializeComponent();
            ConfigureComponent();
            ReadConfiguration();
        }
        </span><span style="color: #0000FF;">#endregion</span><span style="color: #000000;">

        </span><span style="color: #0000FF;">#region</span><span style="color: #000000;"> Public Methods</span><span style="color: #000000;">

        </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">void</span><span style="color: #000000;"> ConfigureComponent()
        {
            txtNamespace.AutoSize </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">false</span><span style="color: #000000;">;
            txtNamespace.Size </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> Size(txtNamespace.Size.Width, </span><span style="color: #800080;">24</span><span style="color: #000000;">);
            txtKeyName.AutoSize </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">false</span><span style="color: #000000;">;
            txtKeyName.Size </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> Size(txtKeyName.Size.Width, </span><span style="color: #800080;">24</span><span style="color: #000000;">);
            txtKeyValue.AutoSize </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">false</span><span style="color: #000000;">;
            txtKeyValue.Size </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> Size(txtKeyValue.Size.Width, </span><span style="color: #800080;">24</span><span style="color: #000000;">);
            txtEventHub.AutoSize </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">false</span><span style="color: #000000;">;
            txtEventHub.Size </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> Size(txtEventHub.Size.Width, </span><span style="color: #800080;">24</span><span style="color: #000000;">);
        }

        </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">void</span><span style="color: #000000;"> HandleException(Exception ex)
        {
            </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (ex </span><span style="color: #000000;">==</span><span style="color: #000000;"> </span><span style="color: #0000FF;">null</span><span style="color: #000000;"> </span><span style="color: #000000;">||</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;">.IsNullOrEmpty(ex.Message))
            {
                </span><span style="color: #0000FF;">return</span><span style="color: #000000;">;
            }
            WriteToLog(</span><span style="color: #0000FF;">string</span><span style="color: #000000;">.Format(CultureInfo.CurrentCulture, ExceptionFormat, ex.Message));
            </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (ex.InnerException </span><span style="color: #000000;">!=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">null</span><span style="color: #000000;"> </span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;"> </span><span style="color: #000000;">!</span><span style="color: #0000FF;">string</span><span style="color: #000000;">.IsNullOrEmpty(ex.InnerException.Message))
            {
                WriteToLog(</span><span style="color: #0000FF;">string</span><span style="color: #000000;">.Format(CultureInfo.CurrentCulture, InnerExceptionFormat, ex.InnerException.Message));
            }
        }
        </span><span style="color: #0000FF;">#endregion</span><span style="color: #000000;">

        </span><span style="color: #0000FF;">#region</span><span style="color: #000000;"> Private Methods</span><span style="color: #000000;">
        </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">static</span><span style="color: #000000;"> </span><span style="color: #0000FF;">bool</span><span style="color: #000000;"> IsJson(</span><span style="color: #0000FF;">string</span><span style="color: #000000;"> item)
        {
            </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (item </span><span style="color: #000000;">==</span><span style="color: #000000;"> </span><span style="color: #0000FF;">null</span><span style="color: #000000;">)
            {
                </span><span style="color: #0000FF;">throw</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> ArgumentException(</span><span style="color: #800000;">"</span><span style="color: #800000;">The item argument cannot be null.</span><span style="color: #800000;">"</span><span style="color: #000000;">);
            }
            </span><span style="color: #0000FF;">try</span><span style="color: #000000;">
            {
                var obj </span><span style="color: #000000;">=</span><span style="color: #000000;"> JToken.Parse(item);
                </span><span style="color: #0000FF;">return</span><span style="color: #000000;"> obj </span><span style="color: #000000;">!=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">null</span><span style="color: #000000;">;
            }
            </span><span style="color: #0000FF;">catch</span><span style="color: #000000;"> (Exception)
            {
                </span><span style="color: #0000FF;">return</span><span style="color: #000000;"> </span><span style="color: #0000FF;">false</span><span style="color: #000000;">;
            }
        }

        </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> IndentJson(</span><span style="color: #0000FF;">string</span><span style="color: #000000;"> json)
        {
            </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (</span><span style="color: #0000FF;">string</span><span style="color: #000000;">.IsNullOrWhiteSpace(json))
            {
                </span><span style="color: #0000FF;">return</span><span style="color: #000000;"> </span><span style="color: #0000FF;">null</span><span style="color: #000000;">;
            }
            dynamic parsedJson </span><span style="color: #000000;">=</span><span style="color: #000000;"> JsonConvert.DeserializeObject(json);
            </span><span style="color: #0000FF;">return</span><span style="color: #000000;"> JsonConvert.SerializeObject(parsedJson, Formatting.Indented);
        }

        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">void</span><span style="color: #000000;"> ReadConfiguration()
        {
            </span><span style="color: #0000FF;">try</span><span style="color: #000000;">
            {
                txtNamespace.Text </span><span style="color: #000000;">=</span><span style="color: #000000;"> ConfigurationManager.AppSettings[NamespaceParameter];
                txtKeyName.Text </span><span style="color: #000000;">=</span><span style="color: #000000;"> ConfigurationManager.AppSettings[KeyNameParameter];
                txtKeyValue.Text </span><span style="color: #000000;">=</span><span style="color: #000000;"> ConfigurationManager.AppSettings[KeyValueParameter];
                txtEventHub.Text </span><span style="color: #000000;">=</span><span style="color: #000000;"> ConfigurationManager.AppSettings[EventHubParameter] </span><span style="color: #000000;">??</span><span style="color: #000000;"> DefaultEventHubName;
                var eventHubDescription </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> EventHubDescription(txtEventHub.Text);
                </span><span style="color: #0000FF;">int</span><span style="color: #000000;"> value;
                var setting </span><span style="color: #000000;">=</span><span style="color: #000000;"> ConfigurationManager.AppSettings[PartitionCountParameter];
                txtPartitionCount.Text </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">int</span><span style="color: #000000;">.TryParse(setting, </span><span style="color: #0000FF;">out</span><span style="color: #000000;"> value) </span><span style="color: #000000;">?</span><span style="color: #000000;">
                                       value.ToString(CultureInfo.InvariantCulture) :
                                       eventHubDescription.PartitionCount.ToString(CultureInfo.InvariantCulture);
                setting </span><span style="color: #000000;">=</span><span style="color: #000000;"> ConfigurationManager.AppSettings[RetentionDaysParameter];
                txtMessageRetentionInDays.Text </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">int</span><span style="color: #000000;">.TryParse(setting, </span><span style="color: #0000FF;">out</span><span style="color: #000000;"> value) </span><span style="color: #000000;">?</span><span style="color: #000000;">
                                       value.ToString(CultureInfo.InvariantCulture) :
                                       eventHubDescription.MessageRetentionInDays.ToString(CultureInfo.InvariantCulture);
                txtLocation.Text </span><span style="color: #000000;">=</span><span style="color: #000000;"> ConfigurationManager.AppSettings[LocationParameter];
                setting </span><span style="color: #000000;">=</span><span style="color: #000000;"> ConfigurationManager.AppSettings[DeviceCountParameter];
                txtDeviceCount.Text </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">int</span><span style="color: #000000;">.TryParse(setting, </span><span style="color: #0000FF;">out</span><span style="color: #000000;"> value) </span><span style="color: #000000;">?</span><span style="color: #000000;"> 
                                       value.ToString(CultureInfo.InvariantCulture) : 
                                       DefaultDeviceNumber.ToString(CultureInfo.InvariantCulture);
                setting </span><span style="color: #000000;">=</span><span style="color: #000000;"> ConfigurationManager.AppSettings[EventIntervalParameter];
                txtEventIntervalInSeconds.Text </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">int</span><span style="color: #000000;">.TryParse(setting, </span><span style="color: #0000FF;">out</span><span style="color: #000000;"> value) </span><span style="color: #000000;">?</span><span style="color: #000000;">
                                       value.ToString(CultureInfo.InvariantCulture) :
                                       DefaultEventIntervalInSeconds.ToString(CultureInfo.InvariantCulture);
                setting </span><span style="color: #000000;">=</span><span style="color: #000000;"> ConfigurationManager.AppSettings[MinValueParameter];
                txtMinValue.Text </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">int</span><span style="color: #000000;">.TryParse(setting, </span><span style="color: #0000FF;">out</span><span style="color: #000000;"> value) </span><span style="color: #000000;">?</span><span style="color: #000000;">
                                       value.ToString(CultureInfo.InvariantCulture) :
                                       DefaultMinValue.ToString(CultureInfo.InvariantCulture);
                setting </span><span style="color: #000000;">=</span><span style="color: #000000;"> ConfigurationManager.AppSettings[MaxValueParameter];
                txtMaxValue.Text </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">int</span><span style="color: #000000;">.TryParse(setting, </span><span style="color: #0000FF;">out</span><span style="color: #000000;"> value) </span><span style="color: #000000;">?</span><span style="color: #000000;">
                                       value.ToString(CultureInfo.InvariantCulture) :
                                       DefaultMaxValue.ToString(CultureInfo.InvariantCulture);
            }
            </span><span style="color: #0000FF;">catch</span><span style="color: #000000;"> (Exception ex)
            {
                HandleException(ex);
            }
        }

        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">void</span><span style="color: #000000;"> WriteToLog(</span><span style="color: #0000FF;">string</span><span style="color: #000000;"> message)
        {
            </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (InvokeRequired)
            {
                Invoke(</span><span style="color: #0000FF;">new</span><span style="color: #000000;"> Action</span><span style="color: #000000;">&lt;</span><span style="color: #0000FF;">string</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">(InternalWriteToLog), </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> </span><span style="color: #0000FF;">object</span><span style="color: #000000;">[] { message });
            }
            </span><span style="color: #0000FF;">else</span><span style="color: #000000;">
            {
                InternalWriteToLog(message);
            }
        }

        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">void</span><span style="color: #000000;"> InternalWriteToLog(</span><span style="color: #0000FF;">string</span><span style="color: #000000;"> message)
        {
            </span><span style="color: #0000FF;">lock</span><span style="color: #000000;"> (</span><span style="color: #0000FF;">this</span><span style="color: #000000;">)
            {
                </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (</span><span style="color: #0000FF;">string</span><span style="color: #000000;">.IsNullOrEmpty(message))
                {
                    </span><span style="color: #0000FF;">return</span><span style="color: #000000;">;
                }
                var lines </span><span style="color: #000000;">=</span><span style="color: #000000;"> message.Split(</span><span style="color: #800000;">'</span><span style="color: #800000;">\n</span><span style="color: #800000;">'</span><span style="color: #000000;">);
                var now </span><span style="color: #000000;">=</span><span style="color: #000000;"> DateTime.Now;
                var space </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;">(</span><span style="color: #800000;">'</span><span style="color: #800000;"> </span><span style="color: #800000;">'</span><span style="color: #000000;">, </span><span style="color: #800080;">19</span><span style="color: #000000;">);

                </span><span style="color: #0000FF;">for</span><span style="color: #000000;"> (var i </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">0</span><span style="color: #000000;">; i </span><span style="color: #000000;">&lt;</span><span style="color: #000000;"> lines.Length; i</span><span style="color: #000000;">++</span><span style="color: #000000;">)
                {
                    </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (i </span><span style="color: #000000;">==</span><span style="color: #000000;"> </span><span style="color: #800080;">0</span><span style="color: #000000;">)
                    {
                        var line </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;">.Format(DateFormat,
                                                 now.Hour,
                                                 now.Minute,
                                                 now.Second,
                                                 lines[i]);
                        lstLog.Items.Add(line);
                    }
                    </span><span style="color: #0000FF;">else</span><span style="color: #000000;">
                    {
                        lstLog.Items.Add(space </span><span style="color: #000000;">+</span><span style="color: #000000;"> lines[i]);
                    }
                }
                lstLog.SelectedIndex </span><span style="color: #000000;">=</span><span style="color: #000000;"> lstLog.Items.Count </span><span style="color: #000000;">-</span><span style="color: #000000;"> </span><span style="color: #800080;">1</span><span style="color: #000000;">;
                lstLog.SelectedIndex </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">-</span><span style="color: #800080;">1</span><span style="color: #000000;">;
            }
        }

        </span><span style="color: #0000FF;">#endregion</span><span style="color: #000000;">

        </span><span style="color: #0000FF;">#region</span><span style="color: #000000;"> Event Handlers</span><span style="color: #000000;">

        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">void</span><span style="color: #000000;"> exitToolStripMenuItem_Click(</span><span style="color: #0000FF;">object</span><span style="color: #000000;"> sender, EventArgs e)
        {
            Close();
        }

        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">void</span><span style="color: #000000;"> clearLogToolStripMenuItem_Click(</span><span style="color: #0000FF;">object</span><span style="color: #000000;"> sender, EventArgs e)
        {
            lstLog.Items.Clear();
        }

        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;summary&gt;</span><span style="color: #008000;">
        </span><span style="color: #808080;">///</span><span style="color: #008000;"> Saves the log to a text file
        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;/summary&gt;</span><span style="color: #008000;">
        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;param name="sender"&gt;</span><span style="color: #008000;">MainForm object</span><span style="color: #808080;">&lt;/param&gt;</span><span style="color: #008000;">
        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;param name="e"&gt;</span><span style="color: #008000;">System.EventArgs parameter</span><span style="color: #808080;">&lt;/param&gt;</span><span style="color: #808080;">
</span><span style="color: #000000;">        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">void</span><span style="color: #000000;"> saveLogToolStripMenuItem_Click(</span><span style="color: #0000FF;">object</span><span style="color: #000000;"> sender, EventArgs e)
        {
            </span><span style="color: #0000FF;">try</span><span style="color: #000000;">
            {
                </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (lstLog.Items.Count </span><span style="color: #000000;">&lt;=</span><span style="color: #000000;"> </span><span style="color: #800080;">0</span><span style="color: #000000;">)
                {
                    </span><span style="color: #0000FF;">return</span><span style="color: #000000;">;
                }
                saveFileDialog.Title </span><span style="color: #000000;">=</span><span style="color: #000000;"> SaveAsTitle;
                saveFileDialog.DefaultExt </span><span style="color: #000000;">=</span><span style="color: #000000;"> SaveAsExtension;
                saveFileDialog.Filter </span><span style="color: #000000;">=</span><span style="color: #000000;"> SaveAsFilter;
                saveFileDialog.FileName </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;">.Format(LogFileNameFormat, DateTime.Now.ToString(CultureInfo.CurrentUICulture).Replace(</span><span style="color: #800000;">'</span><span style="color: #800000;">/</span><span style="color: #800000;">'</span><span style="color: #000000;">, </span><span style="color: #800000;">'</span><span style="color: #800000;">-</span><span style="color: #800000;">'</span><span style="color: #000000;">).Replace(</span><span style="color: #800000;">'</span><span style="color: #800000;">:</span><span style="color: #800000;">'</span><span style="color: #000000;">, </span><span style="color: #800000;">'</span><span style="color: #800000;">-</span><span style="color: #800000;">'</span><span style="color: #000000;">));
                </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (saveFileDialog.ShowDialog() </span><span style="color: #000000;">!=</span><span style="color: #000000;"> DialogResult.OK </span><span style="color: #000000;">||</span><span style="color: #000000;"> 
                    </span><span style="color: #0000FF;">string</span><span style="color: #000000;">.IsNullOrEmpty(saveFileDialog.FileName))
                {
                    </span><span style="color: #0000FF;">return</span><span style="color: #000000;">;
                }
                </span><span style="color: #0000FF;">using</span><span style="color: #000000;"> (var writer </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> StreamWriter(saveFileDialog.FileName))
                {
                    </span><span style="color: #0000FF;">foreach</span><span style="color: #000000;"> (var t </span><span style="color: #0000FF;">in</span><span style="color: #000000;"> lstLog.Items)
                    {
                        writer.WriteLine(t </span><span style="color: #0000FF;">as</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;">);
                    }
                }
            }
            </span><span style="color: #0000FF;">catch</span><span style="color: #000000;"> (Exception ex)
            {
                HandleException(ex);
            }
        }

        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">void</span><span style="color: #000000;"> logWindowToolStripMenuItem_Click(</span><span style="color: #0000FF;">object</span><span style="color: #000000;"> sender, EventArgs e)
        {
            splitContainer.Panel2Collapsed </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">!</span><span style="color: #000000;">((ToolStripMenuItem)sender).Checked;
        }

        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">void</span><span style="color: #000000;"> aboutToolStripMenuItem_Click(</span><span style="color: #0000FF;">object</span><span style="color: #000000;"> sender, EventArgs e)
        {
            var form </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> AboutForm();
            form.ShowDialog();
        }

        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">void</span><span style="color: #000000;"> lstLog_Leave(</span><span style="color: #0000FF;">object</span><span style="color: #000000;"> sender, EventArgs e)
        {
            lstLog.SelectedIndex </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">-</span><span style="color: #800080;">1</span><span style="color: #000000;">;
        }

        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">void</span><span style="color: #000000;"> button_MouseEnter(</span><span style="color: #0000FF;">object</span><span style="color: #000000;"> sender, EventArgs e)
        {
            var control </span><span style="color: #000000;">=</span><span style="color: #000000;"> sender </span><span style="color: #0000FF;">as</span><span style="color: #000000;"> Control;
            </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (control </span><span style="color: #000000;">!=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">null</span><span style="color: #000000;">)
            {
                control.ForeColor </span><span style="color: #000000;">=</span><span style="color: #000000;"> Color.White;
            }
        }

        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">void</span><span style="color: #000000;"> button_MouseLeave(</span><span style="color: #0000FF;">object</span><span style="color: #000000;"> sender, EventArgs e)
        {
            var control </span><span style="color: #000000;">=</span><span style="color: #000000;"> sender </span><span style="color: #0000FF;">as</span><span style="color: #000000;"> Control;
            </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (control </span><span style="color: #000000;">!=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">null</span><span style="color: #000000;">)
            {
                control.ForeColor </span><span style="color: #000000;">=</span><span style="color: #000000;"> SystemColors.ControlText;
            }
        }
        
        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">void</span><span style="color: #000000;"> MainForm_Paint(</span><span style="color: #0000FF;">object</span><span style="color: #000000;"> sender, PaintEventArgs e)
        {
            var width </span><span style="color: #000000;">=</span><span style="color: #000000;"> (mainHeaderPanel.Size.Width </span><span style="color: #000000;">-</span><span style="color: #000000;"> </span><span style="color: #800080;">48</span><span style="color: #000000;">)</span><span style="color: #000000;">/</span><span style="color: #800080;">2</span><span style="color: #000000;">;
            var halfWidth </span><span style="color: #000000;">=</span><span style="color: #000000;"> (width </span><span style="color: #000000;">-</span><span style="color: #000000;"> </span><span style="color: #800080;">16</span><span style="color: #000000;">)</span><span style="color: #000000;">/</span><span style="color: #800080;">2</span><span style="color: #000000;">;

            txtNamespace.Size </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> Size(width, txtNamespace.Size.Height);
            txtKeyName.Size </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> Size(width, txtKeyName.Size.Height);
            txtKeyValue.Size </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> Size(width, txtKeyValue.Size.Height);
            txtEventHub.Size </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> Size(width, txtEventHub.Size.Height);
            txtLocation.Size </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> Size(width, txtLocation.Size.Height);
            txtPartitionCount.Size </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> Size(halfWidth, txtPartitionCount.Size.Height);
            txtMessageRetentionInDays.Size </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> Size(halfWidth, txtMessageRetentionInDays.Size.Height);
            txtDeviceCount.Size </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> Size(halfWidth, txtDeviceCount.Size.Height);
            txtEventIntervalInSeconds.Size </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> Size(halfWidth, txtEventIntervalInSeconds.Size.Height);
            txtMinValue.Size </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> Size(halfWidth, txtMinValue.Size.Height);
            txtMinValue.Size </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> Size(halfWidth, txtMinValue.Size.Height);

            txtEventHub.Location </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> Point(</span><span style="color: #800080;">32</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> width, txtEventHub.Location.Y);
            txtKeyValue.Location </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> Point(</span><span style="color: #800080;">32</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> width, txtKeyValue.Location.Y);
            txtLocation.Location </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> Point(</span><span style="color: #800080;">32</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> width, txtLocation.Location.Y);
            txtMessageRetentionInDays.Location </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> Point(</span><span style="color: #800080;">32</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> halfWidth, txtMessageRetentionInDays.Location.Y);
            txtEventIntervalInSeconds.Location </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> Point(</span><span style="color: #800080;">32</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> halfWidth, txtEventIntervalInSeconds.Location.Y);
            txtMinValue.Location </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> Point(</span><span style="color: #800080;">32</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> width, txtMinValue.Location.Y);
            txtMaxValue.Location </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> Point(</span><span style="color: #800080;">48</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> width </span><span style="color: #000000;">+</span><span style="color: #000000;"> halfWidth, txtMaxValue.Location.Y);

            lblEventHub.Location </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> Point(</span><span style="color: #800080;">32</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> width, lblEventHub.Location.Y);
            lblKeyValue.Location </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> Point(</span><span style="color: #800080;">32</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> width, lblKeyValue.Location.Y);
            lblLocation.Location </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> Point(</span><span style="color: #800080;">32</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> width, lblLocation.Location.Y);
            lblMessageRetentionInDays.Location </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> Point(</span><span style="color: #800080;">32</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> halfWidth, lblMessageRetentionInDays.Location.Y);
            lblEventIntervalInSeconds.Location </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> Point(</span><span style="color: #800080;">32</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> halfWidth, lblEventIntervalInSeconds.Location.Y);
            lblMinValue.Location </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> Point(</span><span style="color: #800080;">32</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> width, lblMinValue.Location.Y);
            lblMaxValue.Location </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> Point(</span><span style="color: #800080;">48</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> width </span><span style="color: #000000;">+</span><span style="color: #000000;"> halfWidth, lblMaxValue.Location.Y);
            radioButtonHttps.Location </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> Point(</span><span style="color: #800080;">32</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> halfWidth, radioButtonAmqp.Location.Y);
        }

        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">void</span><span style="color: #000000;"> MainForm_Shown(</span><span style="color: #0000FF;">object</span><span style="color: #000000;"> sender, EventArgs e)
        {
            txtNamespace.SelectionLength </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">0</span><span style="color: #000000;">;
        }

        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> async </span><span style="color: #0000FF;">void</span><span style="color: #000000;"> btnStart_Click(</span><span style="color: #0000FF;">object</span><span style="color: #000000;"> sender, EventArgs e)
        {
            </span><span style="color: #0000FF;">try</span><span style="color: #000000;">
            {
                </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (</span><span style="color: #0000FF;">string</span><span style="color: #000000;">.Compare(btnStart.Text, Start, StringComparison.OrdinalIgnoreCase) </span><span style="color: #000000;">==</span><span style="color: #000000;"> </span><span style="color: #800080;">0</span><span style="color: #000000;">)
                {
                    </span><span style="color: #008000;">//</span><span style="color: #008000;"> Change button text</span><span style="color: #008000;">
</span><span style="color: #000000;">                    btnStart.Text </span><span style="color: #000000;">=</span><span style="color: #000000;"> Stop;

                    </span><span style="color: #008000;">//</span><span style="color: #008000;"> Validate parameters</span><span style="color: #008000;">
</span><span style="color: #000000;">                    </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (</span><span style="color: #000000;">!</span><span style="color: #000000;">ValidateParameters())
                    {
                        </span><span style="color: #0000FF;">return</span><span style="color: #000000;">;
                    }

                    </span><span style="color: #008000;">//</span><span style="color: #008000;"> Create namespace manager</span><span style="color: #008000;">
</span><span style="color: #000000;">                    var namespaceUri </span><span style="color: #000000;">=</span><span style="color: #000000;"> ServiceBusEnvironment.CreateServiceUri(</span><span style="color: #800000;">"</span><span style="color: #800000;">sb</span><span style="color: #800000;">"</span><span style="color: #000000;">, txtNamespace.Text, </span><span style="color: #0000FF;">string</span><span style="color: #000000;">.Empty);
                    var tokenProvider </span><span style="color: #000000;">=</span><span style="color: #000000;"> TokenProvider.CreateSharedAccessSignatureTokenProvider(txtKeyName.Text, txtKeyValue.Text);
                    var namespaceManager </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> NamespaceManager(namespaceUri, tokenProvider);

                    </span><span style="color: #008000;">//</span><span style="color: #008000;"> Check if the event hub already exists, if not, create the event hub.</span><span style="color: #008000;">
</span><span style="color: #000000;">                    var eventHubDescription </span><span style="color: #000000;">=</span><span style="color: #000000;"> await namespaceManager.EventHubExistsAsync(txtEventHub.Text) </span><span style="color: #000000;">?</span><span style="color: #000000;">
                                              await namespaceManager.GetEventHubAsync(txtEventHub.Text) :
                                              await namespaceManager.CreateEventHubAsync(</span><span style="color: #0000FF;">new</span><span style="color: #000000;"> EventHubDescription(txtEventHub.Text)
                                              {
                                                  PartitionCount </span><span style="color: #000000;">=</span><span style="color: #000000;"> txtPartitionCount.IntegerValue,
                                                  MessageRetentionInDays </span><span style="color: #000000;">=</span><span style="color: #000000;"> txtMessageRetentionInDays.IntegerValue
                                              });
                    WriteToLog(</span><span style="color: #0000FF;">string</span><span style="color: #000000;">.Format(EventHubCreatedOrRetrieved, txtEventHub.Text));

                    </span><span style="color: #008000;">//</span><span style="color: #008000;"> Check if the SAS authorization rule used by devices to send events to the event hub already exists, if not, create the rule.</span><span style="color: #008000;">
</span><span style="color: #000000;">                    var authorizationRule </span><span style="color: #000000;">=</span><span style="color: #000000;"> eventHubDescription.
                                            Authorization.
                                            FirstOrDefault(r </span><span style="color: #000000;">=&gt;</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;">.Compare(r.KeyName, 
                                                                                SenderSharedAccessKey, 
                                                                                StringComparison.InvariantCultureIgnoreCase) 
                                                                                </span><span style="color: #000000;">==</span><span style="color: #000000;"> </span><span style="color: #800080;">0</span><span style="color: #000000;">) </span><span style="color: #0000FF;">as</span><span style="color: #000000;"> SharedAccessAuthorizationRule;
                    </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (authorizationRule </span><span style="color: #000000;">==</span><span style="color: #000000;"> </span><span style="color: #0000FF;">null</span><span style="color: #000000;">)
                    {
                        authorizationRule </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> SharedAccessAuthorizationRule(SenderSharedAccessKey, 
                                                                                 SharedAccessAuthorizationRule.GenerateRandomKey(), 
                                                                                 </span><span style="color: #0000FF;">new</span><span style="color: #000000;">[]
                                                                                 {
                                                                                     AccessRights.Send
                                                                                 });
                        eventHubDescription.Authorization.Add(authorizationRule);
                        await namespaceManager.UpdateEventHubAsync(eventHubDescription);
                    }
                    
                    cancellationTokenSource </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> CancellationTokenSource();
                    var serviceBusNamespace </span><span style="color: #000000;">=</span><span style="color: #000000;"> txtNamespace.Text;
                    var eventHubName </span><span style="color: #000000;">=</span><span style="color: #000000;"> txtEventHub.Text;
                    var senderKey </span><span style="color: #000000;">=</span><span style="color: #000000;"> authorizationRule.PrimaryKey;
                    var location </span><span style="color: #000000;">=</span><span style="color: #000000;"> txtLocation.Text;
                    var eventInterval </span><span style="color: #000000;">=</span><span style="color: #000000;"> txtEventIntervalInSeconds.IntegerValue </span><span style="color: #000000;">*</span><span style="color: #000000;"> </span><span style="color: #800080;">1000</span><span style="color: #000000;">;
                    var minValue </span><span style="color: #000000;">=</span><span style="color: #000000;"> txtMinValue.IntegerValue;
                    var maxValue </span><span style="color: #000000;">=</span><span style="color: #000000;"> txtMaxValue.IntegerValue;
                    var cancellationToken </span><span style="color: #000000;">=</span><span style="color: #000000;"> cancellationTokenSource.Token;

                    </span><span style="color: #008000;">//</span><span style="color: #008000;"> Create one task for each device</span><span style="color: #008000;">
</span><span style="color: #000000;">                    </span><span style="color: #0000FF;">for</span><span style="color: #000000;"> (var i </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">1</span><span style="color: #000000;">; i </span><span style="color: #000000;">&lt;=</span><span style="color: #000000;"> txtDeviceCount.IntegerValue; i</span><span style="color: #000000;">++</span><span style="color: #000000;">)
                    {
                        var deviceId </span><span style="color: #000000;">=</span><span style="color: #000000;"> i;
                        </span><span style="color: #0000FF;">#pragma</span><span style="color: #000000;"> warning disable 4014</span><span style="color: #000000;">
                        </span><span style="color: #0000FF;">#pragma</span><span style="color: #000000;"> warning disable 4014</span><span style="color: #000000;">
                        Task.Run(async () </span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">
                        </span><span style="color: #0000FF;">#pragma</span><span style="color: #000000;"> warning restore 4014</span><span style="color: #000000;">
                        {
                            var deviceName </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;">.Format(</span><span style="color: #800000;">"</span><span style="color: #800000;">device{0:000}</span><span style="color: #800000;">"</span><span style="color: #000000;">, deviceId);
                            var random </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> Random((</span><span style="color: #0000FF;">int</span><span style="color: #000000;">)DateTime.Now.Ticks);

                            </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (radioButtonAmqp.Checked)
                            {
                                </span><span style="color: #008000;">//</span><span style="color: #008000;"> The token has the following format: 
                                </span><span style="color: #008000;">//</span><span style="color: #008000;"> SharedAccessSignature sr={URI}&amp;sig={HMAC_SHA256_SIGNATURE}&amp;se={EXPIRATION_TIME}&amp;skn={KEY_NAME}</span><span style="color: #008000;">
</span><span style="color: #000000;">                                var token </span><span style="color: #000000;">=</span><span style="color: #000000;"> CreateSasTokenForAmqpSender(SenderSharedAccessKey,
                                                                        senderKey,
                                                                        serviceBusNamespace,
                                                                        eventHubName,
                                                                        deviceName,
                                                                        TimeSpan.FromDays(</span><span style="color: #800080;">1</span><span style="color: #000000;">));
                                WriteToLog(</span><span style="color: #0000FF;">string</span><span style="color: #000000;">.Format(SasToken, deviceId));

                                var messagingFactory </span><span style="color: #000000;">=</span><span style="color: #000000;"> MessagingFactory.Create(ServiceBusEnvironment.CreateServiceUri(</span><span style="color: #800000;">"</span><span style="color: #800000;">sb</span><span style="color: #800000;">"</span><span style="color: #000000;">, serviceBusNamespace, </span><span style="color: #800000;">""</span><span style="color: #000000;">), </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> MessagingFactorySettings
                                {
                                    TokenProvider </span><span style="color: #000000;">=</span><span style="color: #000000;"> TokenProvider.CreateSharedAccessSignatureTokenProvider(token),
                                    TransportType </span><span style="color: #000000;">=</span><span style="color: #000000;"> TransportType.Amqp
                                });
                                WriteToLog(</span><span style="color: #0000FF;">string</span><span style="color: #000000;">.Format(MessagingFactoryCreated, deviceId));

                                </span><span style="color: #008000;">//</span><span style="color: #008000;"> Each device uses a different publisher endpoint: [EventHub]/publishers/[PublisherName]</span><span style="color: #008000;">
</span><span style="color: #000000;">                                var eventHubClient </span><span style="color: #000000;">=</span><span style="color: #000000;"> messagingFactory.CreateEventHubClient(String.Format(</span><span style="color: #800000;">"</span><span style="color: #800000;">{0}/publishers/{1}</span><span style="color: #800000;">"</span><span style="color: #000000;">, eventHubName, deviceName));
                                WriteToLog(</span><span style="color: #0000FF;">string</span><span style="color: #000000;">.Format(EventHubClientCreated, deviceId, eventHubClient.Path));

                                </span><span style="color: #0000FF;">while</span><span style="color: #000000;"> (</span><span style="color: #000000;">!</span><span style="color: #000000;">cancellationToken.IsCancellationRequested)
                                {
                                    </span><span style="color: #008000;">//</span><span style="color: #008000;"> Create random value</span><span style="color: #008000;">
</span><span style="color: #000000;">                                    var value </span><span style="color: #000000;">=</span><span style="color: #000000;"> random.Next(minValue, maxValue </span><span style="color: #000000;">+</span><span style="color: #000000;"> </span><span style="color: #800080;">1</span><span style="color: #000000;">);

                                    </span><span style="color: #008000;">//</span><span style="color: #008000;"> Create EventData object with the payload serialized in JSON format </span><span style="color: #008000;">
</span><span style="color: #000000;">                                    </span><span style="color: #0000FF;">using</span><span style="color: #000000;"> (var eventData </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> EventData(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(</span><span style="color: #0000FF;">new</span><span style="color: #000000;"> Payload
                                    {
                                        EventId </span><span style="color: #000000;">=</span><span style="color: #000000;"> eventId</span><span style="color: #000000;">++</span><span style="color: #000000;">,
                                        DeviceId </span><span style="color: #000000;">=</span><span style="color: #000000;"> deviceId,
                                        Value </span><span style="color: #000000;">=</span><span style="color: #000000;"> value,
                                        Timestamp </span><span style="color: #000000;">=</span><span style="color: #000000;"> DateTime.UtcNow
                                    })))
                                    {
                                        PartitionKey </span><span style="color: #000000;">=</span><span style="color: #000000;"> deviceName
                                    })
                                    {
                                        </span><span style="color: #008000;">//</span><span style="color: #008000;"> Create custom properties</span><span style="color: #008000;">
</span><span style="color: #000000;">                                        eventData.Properties.Add(DeviceId, deviceId);
                                        eventData.Properties.Add(DeviceName, deviceName);
                                        eventData.Properties.Add(DeviceLocation, location);
                                        eventData.Properties.Add(Value, value);

                                        </span><span style="color: #008000;">//</span><span style="color: #008000;"> Send the event to the event hub</span><span style="color: #008000;">
</span><span style="color: #000000;">                                        await eventHubClient.SendAsync(eventData);
                                        WriteToLog(</span><span style="color: #0000FF;">string</span><span style="color: #000000;">.Format(EventSent, deviceId, deviceName, value));
                                    }

                                    </span><span style="color: #008000;">//</span><span style="color: #008000;"> Wait for the event time interval</span><span style="color: #008000;">
</span><span style="color: #000000;">                                    Thread.Sleep(eventInterval);
                                }
                            }
                            </span><span style="color: #0000FF;">else</span><span style="color: #000000;">
                            {
                                </span><span style="color: #008000;">//</span><span style="color: #008000;"> The token has the following format: 
                                </span><span style="color: #008000;">//</span><span style="color: #008000;"> SharedAccessSignature sr={URI}&amp;sig={HMAC_SHA256_SIGNATURE}&amp;se={EXPIRATION_TIME}&amp;skn={KEY_NAME}</span><span style="color: #008000;">
</span><span style="color: #000000;">                                var token </span><span style="color: #000000;">=</span><span style="color: #000000;"> CreateSasTokenForHttpsSender(SenderSharedAccessKey,
                                                                         senderKey,
                                                                         serviceBusNamespace,
                                                                         eventHubName,
                                                                         deviceName,
                                                                         TimeSpan.FromDays(</span><span style="color: #800080;">1</span><span style="color: #000000;">));
                                WriteToLog(</span><span style="color: #0000FF;">string</span><span style="color: #000000;">.Format(SasToken, deviceId));

                                </span><span style="color: #008000;">//</span><span style="color: #008000;"> Create HttpClient object used to send events to the event hub.</span><span style="color: #008000;">
</span><span style="color: #000000;">                                var httpClient </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> HttpClient
                                {
                                    BaseAddress </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> Uri(String.Format(</span><span style="color: #800000;">"</span><span style="color: #800000;">https://{0}.servicebus.windows.net/{1}/publishers/{2}</span><span style="color: #800000;">"</span><span style="color: #000000;">, 
                                                                        serviceBusNamespace, 
                                                                        eventHubName, 
                                                                        deviceName).ToLower())
                                };
                                httpClient.DefaultRequestHeaders.TryAddWithoutValidation(</span><span style="color: #800000;">"</span><span style="color: #800000;">Authorization</span><span style="color: #800000;">"</span><span style="color: #000000;">, token);
                                httpClient.DefaultRequestHeaders.Add(</span><span style="color: #800000;">"</span><span style="color: #800000;">ContentType</span><span style="color: #800000;">"</span><span style="color: #000000;">, </span><span style="color: #800000;">"</span><span style="color: #800000;">application/json;type=entry;charset=utf-8</span><span style="color: #800000;">"</span><span style="color: #000000;">);
                                WriteToLog(</span><span style="color: #0000FF;">string</span><span style="color: #000000;">.Format(HttpClientCreated, deviceId, httpClient.BaseAddress));

                                </span><span style="color: #0000FF;">while</span><span style="color: #000000;"> (</span><span style="color: #000000;">!</span><span style="color: #000000;">cancellationToken.IsCancellationRequested)
                                {
                                    </span><span style="color: #008000;">//</span><span style="color: #008000;"> Create random value</span><span style="color: #008000;">
</span><span style="color: #000000;">                                    var value </span><span style="color: #000000;">=</span><span style="color: #000000;"> random.Next(minValue, maxValue </span><span style="color: #000000;">+</span><span style="color: #000000;"> </span><span style="color: #800080;">1</span><span style="color: #000000;">);

                                    </span><span style="color: #008000;">//</span><span style="color: #008000;"> Create HttpContent</span><span style="color: #008000;">
</span><span style="color: #000000;">                                    var postContent </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> ByteArrayContent(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(</span><span style="color: #0000FF;">new</span><span style="color: #000000;"> Payload
                                    {
                                        EventId </span><span style="color: #000000;">=</span><span style="color: #000000;"> eventId</span><span style="color: #000000;">++</span><span style="color: #000000;">,
                                        DeviceId </span><span style="color: #000000;">=</span><span style="color: #000000;"> deviceId,
                                        Value </span><span style="color: #000000;">=</span><span style="color: #000000;"> value,
                                        Timestamp </span><span style="color: #000000;">=</span><span style="color: #000000;"> DateTime.UtcNow
                                    })));

                                    </span><span style="color: #008000;">//</span><span style="color: #008000;"> Create custom properties</span><span style="color: #008000;">
</span><span style="color: #000000;">                                    
                                    postContent.Headers.Add(DeviceId, deviceId.ToString(CultureInfo.InvariantCulture));
                                    postContent.Headers.Add(DeviceName, deviceName);
                                    </span><span style="color: #008000;">//</span><span style="color: #008000;">postContent.Headers.Add(DeviceLocation, location);</span><span style="color: #008000;">
</span><span style="color: #000000;">                                    postContent.Headers.Add(Value, value.ToString(CultureInfo.InvariantCulture));

                                    </span><span style="color: #0000FF;">try</span><span style="color: #000000;">
                                    {
                                        var response </span><span style="color: #000000;">=</span><span style="color: #000000;"> await httpClient.PostAsync(httpClient.BaseAddress </span><span style="color: #000000;">+</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">/messages</span><span style="color: #800000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">?timeout=60</span><span style="color: #800000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> ApiVersion, postContent, cancellationToken);
                                        response.EnsureSuccessStatusCode();
                                        WriteToLog(</span><span style="color: #0000FF;">string</span><span style="color: #000000;">.Format(EventSent, deviceId, deviceName, value));
                                    }
                                    </span><span style="color: #0000FF;">catch</span><span style="color: #000000;"> (HttpRequestException ex)
                                    {
                                        WriteToLog(</span><span style="color: #0000FF;">string</span><span style="color: #000000;">.Format(SendFailed, deviceId, ex.Message));
                                    }
                                }
                            }
                        },
                        cancellationToken).ContinueWith(t </span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">
</span><span style="color: #0000FF;">#pragma</span><span style="color: #000000;"> warning restore 4014</span><span style="color: #000000;">
                        </span><span style="color: #0000FF;">#pragma</span><span style="color: #000000;"> warning restore 4014</span><span style="color: #000000;">
                        {
                            </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (t.IsFaulted </span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;"> t.Exception </span><span style="color: #000000;">!=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">null</span><span style="color: #000000;">)
                            {
                                HandleException(t.Exception);
                            }
                        }, cancellationToken);
                    }

                }
                </span><span style="color: #0000FF;">else</span><span style="color: #000000;">
                {
                    </span><span style="color: #008000;">//</span><span style="color: #008000;"> Change button text</span><span style="color: #008000;">
</span><span style="color: #000000;">                    btnStart.Text </span><span style="color: #000000;">=</span><span style="color: #000000;"> Start;
                    </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (cancellationTokenSource </span><span style="color: #000000;">!=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">null</span><span style="color: #000000;">)
                    {
                        cancellationTokenSource.Cancel();
                    }
                }
            }
            </span><span style="color: #0000FF;">catch</span><span style="color: #000000;"> (Exception ex)
            {
                HandleException(ex);
            }
        }

        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">bool</span><span style="color: #000000;"> ValidateParameters()
        {
            </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (</span><span style="color: #0000FF;">string</span><span style="color: #000000;">.IsNullOrWhiteSpace(txtNamespace.Text))
            {
                WriteToLog(NamespaceCannonBeNull);
                </span><span style="color: #0000FF;">return</span><span style="color: #000000;"> </span><span style="color: #0000FF;">false</span><span style="color: #000000;">;
            }
            </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (</span><span style="color: #0000FF;">string</span><span style="color: #000000;">.IsNullOrWhiteSpace(txtEventHub.Text))
            {
                WriteToLog(EventHubNameCannonBeNull);
                </span><span style="color: #0000FF;">return</span><span style="color: #000000;"> </span><span style="color: #0000FF;">false</span><span style="color: #000000;">;
            }
            </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (</span><span style="color: #0000FF;">string</span><span style="color: #000000;">.IsNullOrWhiteSpace(txtKeyName.Text))
            {
                WriteToLog(KeyNameCannonBeNull);
                </span><span style="color: #0000FF;">return</span><span style="color: #000000;"> </span><span style="color: #0000FF;">false</span><span style="color: #000000;">;
            }
            </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (</span><span style="color: #0000FF;">string</span><span style="color: #000000;">.IsNullOrWhiteSpace(txtKeyValue.Text))
            {
                WriteToLog(KeyValueCannonBeNull);
                </span><span style="color: #0000FF;">return</span><span style="color: #000000;"> </span><span style="color: #0000FF;">false</span><span style="color: #000000;">;
            }
            </span><span style="color: #0000FF;">return</span><span style="color: #000000;"> </span><span style="color: #0000FF;">true</span><span style="color: #000000;">;
        }

        </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">static</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> CreateSasTokenForAmqpSender(</span><span style="color: #0000FF;">string</span><span style="color: #000000;"> senderKeyName, 
                                                         </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> senderKey, 
                                                         </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> serviceNamespace, 
                                                         </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> hubName, 
                                                         </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> publisherName, 
                                                         TimeSpan tokenTimeToLive)
        {
            </span><span style="color: #008000;">//</span><span style="color: #008000;"> This is the format of the publisher endpoint. Each device uses a different publisher endpoint.
            </span><span style="color: #008000;">//</span><span style="color: #008000;"> sb:</span><span style="color: #008000;">//</span><span style="color: #008000;">&lt;NAMESPACE&gt;.servicebus.windows.net/&lt;EVENT_HUB_NAME&gt;/publishers/&lt;PUBLISHER_NAME&gt;. </span><span style="color: #008000;">
</span><span style="color: #000000;">            var serviceUri </span><span style="color: #000000;">=</span><span style="color: #000000;"> ServiceBusEnvironment.CreateServiceUri(</span><span style="color: #800000;">"</span><span style="color: #800000;">sb</span><span style="color: #800000;">"</span><span style="color: #000000;">, 
                                                                    serviceNamespace, 
                                                                    String.Format(</span><span style="color: #800000;">"</span><span style="color: #800000;">{0}/publishers/{1}</span><span style="color: #800000;">"</span><span style="color: #000000;">, 
                                                                                   hubName, 
                                                                                   publisherName))
                .ToString()
                .Trim(</span><span style="color: #800000;">'</span><span style="color: #800000;">/</span><span style="color: #800000;">'</span><span style="color: #000000;">);
            </span><span style="color: #008000;">//</span><span style="color: #008000;"> SharedAccessSignature sr=&lt;URL-encoded-resourceURI&gt;&amp;sig=&lt;URL-encoded-signature-string&gt;&amp;se=&lt;expiry-time-in-ISO-8061-format. &gt;&amp;skn=&lt;senderKeyName&gt;</span><span style="color: #008000;">
</span><span style="color: #000000;">            </span><span style="color: #0000FF;">return</span><span style="color: #000000;"> SharedAccessSignatureTokenProvider.GetSharedAccessSignature(senderKeyName, senderKey, serviceUri, tokenTimeToLive);
        }

        </span><span style="color: #008000;">//</span><span style="color: #008000;"> Create a SAS token for a specified scope. SAS tokens are described in </span><span style="color: #008000; text-decoration: underline;">http://msdn.microsoft.com/en-us/library/windowsazure/dn170477.aspx.</span><span style="color: #008000;">
</span><span style="color: #000000;">        </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">static</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> CreateSasTokenForHttpsSender(</span><span style="color: #0000FF;">string</span><span style="color: #000000;"> senderKeyName, 
                                                           </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> senderKey, 
                                                           </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> serviceNamespace, 
                                                           </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> hubName, 
                                                           </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> publisherName, 
                                                           TimeSpan tokenTimeToLive)
        {
            </span><span style="color: #008000;">//</span><span style="color: #008000;"> Set token lifetime. When supplying a device with a token, you might want to use a longer expiration time.</span><span style="color: #008000;">
</span><span style="color: #000000;">            var origin </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> DateTime(</span><span style="color: #800080;">1970</span><span style="color: #000000;">, </span><span style="color: #800080;">1</span><span style="color: #000000;">, </span><span style="color: #800080;">1</span><span style="color: #000000;">, </span><span style="color: #800080;">0</span><span style="color: #000000;">, </span><span style="color: #800080;">0</span><span style="color: #000000;">, </span><span style="color: #800080;">0</span><span style="color: #000000;">, </span><span style="color: #800080;">0</span><span style="color: #000000;">);
            var difference </span><span style="color: #000000;">=</span><span style="color: #000000;"> DateTime.Now.ToUniversalTime() </span><span style="color: #000000;">-</span><span style="color: #000000;"> origin;
            var tokenExpirationTime </span><span style="color: #000000;">=</span><span style="color: #000000;"> Convert.ToUInt32(difference.TotalSeconds) </span><span style="color: #000000;">+</span><span style="color: #000000;"> tokenTimeToLive.Seconds;

            </span><span style="color: #008000;">//</span><span style="color: #008000;"> https:</span><span style="color: #008000;">//</span><span style="color: #008000;">&lt;NAMESPACE&gt;.servicebus.windows.net/&lt;EVENT_HUB_NAME&gt;/publishers/&lt;PUBLISHER_NAME&gt;. </span><span style="color: #008000;">
</span><span style="color: #000000;">            var uri </span><span style="color: #000000;">=</span><span style="color: #000000;"> ServiceBusEnvironment.CreateServiceUri(</span><span style="color: #800000;">"</span><span style="color: #800000;">https</span><span style="color: #800000;">"</span><span style="color: #000000;">, serviceNamespace, String.Format(</span><span style="color: #800000;">"</span><span style="color: #800000;">{0}/publishers/{1}</span><span style="color: #800000;">"</span><span style="color: #000000;">, hubName, publisherName))
                .ToString()
                .Trim(</span><span style="color: #800000;">'</span><span style="color: #800000;">/</span><span style="color: #800000;">'</span><span style="color: #000000;">);
            var stringToSign </span><span style="color: #000000;">=</span><span style="color: #000000;"> HttpUtility.UrlEncode(uri) </span><span style="color: #000000;">+</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">\n</span><span style="color: #800000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> tokenExpirationTime;
            var hmac </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> HMACSHA256(Encoding.UTF8.GetBytes(senderKey));

            var signature </span><span style="color: #000000;">=</span><span style="color: #000000;"> Convert.ToBase64String(hmac.ComputeHash(Encoding.UTF8.GetBytes(stringToSign)));

            </span><span style="color: #008000;">//</span><span style="color: #008000;"> SharedAccessSignature sr=&lt;URL-encoded-resourceURI&gt;&amp;sig=&lt;URL-encoded-signature-string&gt;&amp;se=&lt;expiry-time-in-ISO-8061-format. &gt;&amp;skn=&lt;senderKeyName&gt;</span><span style="color: #008000;">
</span><span style="color: #000000;">            var token </span><span style="color: #000000;">=</span><span style="color: #000000;"> String.Format(CultureInfo.InvariantCulture, </span><span style="color: #800000;">"</span><span style="color: #800000;">SharedAccessSignature sr={0}&amp;sig={1}&amp;se={2}&amp;skn={3}</span><span style="color: #800000;">"</span><span style="color: #000000;">,
            HttpUtility.UrlEncode(uri), HttpUtility.UrlEncode(signature), tokenExpirationTime, senderKeyName);
            </span><span style="color: #0000FF;">return</span><span style="color: #000000;"> token;
        }
        </span><span style="color: #0000FF;">#endregion</span><span style="color: #000000;">
    }
}</span></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --></div>
  </div>
</div>]]></content:encoded>
    </item>
    <item>
      <title>Service Bus Explorer 2.6 now available!</title>
      <link>https://docs.microsoft.com/archive/blogs/paolos/service-bus-explorer-2-6-now-available</link>
      <pubDate>Mon, 02 Mar 2015 08:46:47 GMT</pubDate>
      <dc:creator><![CDATA[Paolo Salvatori]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/paolos/2015/03/02/service-bus-explorer-2-6-now-available/</guid>
      <description><![CDATA[I just released an improved version of the Service Bus Explorer tool based on the...]]></description>
      <content:encoded><![CDATA[<p>I just released an improved version of the <a href="http://code.msdn.microsoft.com/windowsapps/Service-Bus-Explorer-f2abca5a">Service Bus Explorer</a> tool based on the <a href="http://www.nuget.org/packages/WindowsAzure.ServiceBus/">Microsoft.ServiceBus.dll</a> 2.6.1.0. You can find the code here:</p>
<ul>
<li><a href="https://code.msdn.microsoft.com/windowsazure/Service-Bus-Explorer-f2abca5a">MSDN Code Gallery</a> (suggested)</li>
<li><a href="https://github.com/paolosalvatori/ServiceBusExplorer">GitHub</a> (mostly for developers and contributors)</li>
<li><a href="https://chocolatey.org/packages/ServiceBusExplorer/">Chocolatey</a></li>
</ul>
<p>The zip file contains:</p>
<ul>
<li>The source code for the Service Bus Explorer 2.6.1.0. This version of the tool uses the <a href="http://www.nuget.org/packages/WindowsAzure.ServiceBus/">Microsoft.ServiceBus.dll</a> 2.5.3.0 that is compatible with the current version of the Windows Azure Service Bus, but not with the Service Bus 1.1, that is, the current version of the on-premises version of the Service Bus.</li>
<li>The Service Bus Explorer 2.1.3.0. This version can be used with the Service Bus 1.1. The Service Bus Explorer 2.1 uses the <a href="http://www.nuget.org/packages/WindowsAzure.ServiceBus/">Microsoft.ServiceBus.dll</a> client library which is compatible with the Service Bus for Windows Server 1.1 RTM version. You can download the source code of the Service Bus Explorer 2.1.3 from my <a href="http://1drv.ms/1nEl7ps">OneDrive</a>.</li>
</ul>
<p>This version introduces the following updates:</p>
<ul>
<li>The tool now uses the <strong>Microsoft.ServiceBus.dll v.2.6.1.0</strong>.</li>
<li>Completely refreshed support for dynamic relay services and added full support for persistent relay services. For more information on persistent relay services, see <a href="https://code.msdn.microsoft.com/windowsazure/How-to-handle-Service-Bus-6d65eca1">How to handle Service Bus Relay Services in a multi-tenant environment</a>.</li>
<li>You can select dynamic and persistent relay services in the main treeview and view their properties in the main panel.</li>
</ul>
<p style="text-align: center;"><img id="134454" src="https://i1.code.msdn.s-msft.com/windowsapps/service-bus-explorer-f2abca5a/image/file/134454/1/relayservices01.png" alt="" width="372" height="570" /></p>
<ul>
<li><span style="text-align: center;">You can create, delete, update persistent relay services. In particular, you can define the relay type or binding, the transport security and client authorization characteristics of the persistent relay service in the </span><strong style="text-align: center;">Description </strong><span style="text-align: center;">tab of the </span><strong style="text-align: center;">HandleRelayControl</strong><span style="text-align: center;">. </span></li>
</ul>
<p style="text-align: center;"><img id="134456" src="https://i1.code.msdn.s-msft.com/windowsapps/service-bus-explorer-f2abca5a/image/file/134456/1/relayservices02.png" alt="" width="800" /></p>
<p style="text-align: center;"><strong>Relay service definition</strong></p>
<ul>
<li><span style="text-align: center;">You can create, review, update, delete the authorization rules alias shared access policies at the entity level for persistent relay services </span><span style="text-align: center;">n the </span><strong style="text-align: center;">Authorization Rules </strong><span style="text-align: center;">tab of the </span><strong style="text-align: center;">HandleRelayControl</strong><span style="text-align: center;">. </span></li>
</ul>
<p style="text-align: center;"><img id="134457" src="https://i1.code.msdn.s-msft.com/windowsapps/service-bus-explorer-f2abca5a/image/file/134457/1/relayservices03.png" alt="" width="800" /></p>
<p style="text-align: center;"><strong>Relay service authorization rules </strong></p>
<ul>
<li>You can query the metrics of both persistent and dynamic relay services in the <strong>Metrics </strong>tab of the <strong>HandleRelayControl</strong>. See point <strong>3</strong> in the picture below. For more information on this subject, see <a href="https://msdn.microsoft.com/en-us/library/azure/dn163589.aspx">Service Bus Entity Metrics REST APIs</a>.</li>
</ul>
<p style="text-align: center;"><img id="134458" src="https://i1.code.msdn.s-msft.com/windowsapps/service-bus-explorer-f2abca5a/image/file/134458/1/relayservices04.png" alt="" width="800" /></p>
<p style="text-align: center;"><strong>Metric rule definition</strong></p>
<p style="text-align: center;"><strong><img id="134459" src="https://i1.code.msdn.s-msft.com/windowsapps/service-bus-explorer-f2abca5a/image/file/134459/1/relayservices05.png" alt="" width="800" /> <br /></strong></p>
<p style="text-align: center;"><strong>Metrics data and charts</strong></p>
<ul>
<li>You can test both dynamic and persistent relay services in SDI and MDI mode.</li>
</ul>
<p style="text-align: center;"><img id="134460" src="https://i1.code.msdn.s-msft.com/windowsapps/service-bus-explorer-f2abca5a/image/file/134460/1/relayservices06.png" alt="" width="800" /></p>
<ul>
<li>Added support to import/export persistent relay services from/to an XML file.</li>
<li>When the <strong>saveMessageToFile </strong>setting in the configuration file is set to <strong>true</strong>, the message content of the Test Relay form is saved to file on exit.</li>
</ul>
<p><img id="134452" src="https://i1.code.msdn.s-msft.com/windowsapps/service-bus-explorer-f2abca5a/image/file/134452/1/relaymessage.png" alt="" width="800" /></p>
<ul>
<li>Added support for the <a href="https://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.partitiondescription.aspx">PartitionDescription</a>.<a href="https://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.partitiondescription.lastenqueuedoffset.aspx">LastEnqueuedOffset</a>, <a href="https://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.partitiondescription.aspx">PartitionDescription</a>.<a href="https://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.partitiondescription.lastenqueuedtimeutc.aspx">LastEnqueuedTimeUtc</a>, <a href="https://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.partitiondescription.aspx">PartitionDescription</a>.<a href="https://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.partitiondescription.incomingbytespersecond.aspx">IncomingBytesPerSecond</a>, <a href="https://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.partitiondescription.aspx">PartitionDescription</a>.<a href="https://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.partitiondescription.outgoingbytespersecond.aspx">OutgoingBytesPerSecond</a> in both the <strong>HandlePartitionControl</strong> and <strong>PartitionListenerControl</strong> as shown in the figures below.</li>
</ul>
<p style="text-align: center;"><img id="134463" src="https://i1.code.msdn.s-msft.com/windowsapps/service-bus-explorer-f2abca5a/image/file/134463/1/bytespersecond01.png" alt="" width="800" /></p>
<p style="text-align: center;"><strong>HandlePartitionControl</strong></p>
<p style="text-align: center;"><img id="134464" src="https://i1.code.msdn.s-msft.com/windowsapps/service-bus-explorer-f2abca5a/image/file/134464/1/bytespersecond02.png" alt="" width="800" /></p>
<p style="text-align: center;"><strong>Consumer Group / Partition Listener </strong></p>
<ul>
<li>The <strong>Consumer Group / Partition Listener </strong>control added the possibility to start receiving events from a specific point in time by defining a value for the <a href="https://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.eventhubreceiver.aspx">EventHubReceiver</a>.<a href="https://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.eventhubreceiver.startingdatetimeutc.aspx">StartingDateTimeUtc</a> property. <strong>Note</strong>: you have to specify date and time in UTC format, not in the local date and time format.</li>
</ul>
<p style="text-align: center;"><img id="134480" src="https://i1.code.msdn.s-msft.com/windowsapps/service-bus-explorer-f2abca5a/image/file/134480/1/startingdatetimeutc01.png" alt="" width="800" /></p>
<p style="text-align: center;"><strong>Consumer Group / Partition Listener: Listener Tab</strong></p>
<p style="text-align: center;"><img id="134481" src="https://i1.code.msdn.s-msft.com/windowsapps/service-bus-explorer-f2abca5a/image/file/134481/1/startingdatetimeutc02.png" alt="" width="800" /></p>
<p style="text-align: center;"><strong><strong>Consumer Group / Partition Listener: EventsTab</strong> <br /></strong></p>
<ul>
<li>The value of the <a href="https://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.eventdata.aspx">EventData</a>.<a href="https://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.eventdata.serializedsizeinbytes.aspx">SerializedSizeInBytes</a> property is now used to calculate KB/sec in the <strong>PartitionListenerControl</strong>.</li>
</ul>
<p style="text-align: center;"><img id="134461" src="https://i1.code.msdn.s-msft.com/windowsapps/service-bus-explorer-f2abca5a/image/file/134461/1/partitionlistenercontrol01.png" alt="" width="800" /></p>
<p style="text-align: center;"><strong>Consumer Group / Partition Listener</strong></p>
<ul>
<li>Fixed visualization of event data properties in the <strong>Consumer Group / Partition Listener </strong>control (<strong>PartitionListenerControl</strong>).</li>
<li>Greatly improved message tracking in the <strong>Consumer Group / Partition Listener </strong>control (<strong>PartitionListenerControl</strong>).</li>
<li>Fixed and extended <strong>Clear </strong>funtionality in the <strong>Consumer Group / Partition Listener </strong>control (<strong>PartitionListenerControl</strong>).</li>
<li>Added the <strong>All </strong>item to <strong>Metrics</strong>. When <strong> All </strong>is selected, the tool will retrieve all the metrics for the selected entity. See point <strong>1</strong> in the picture below.</li>
<li>Added the possibility to delete a single metric query by pressing the delete button at the end of the row. See point <strong>2 </strong>in the picture below.</li>
</ul>
<p style="text-align: center;"><img id="134467" src="https://i1.code.msdn.s-msft.com/windowsapps/service-bus-explorer-f2abca5a/image/file/134467/1/allmetric.png" alt="" width="800" /></p>
<ul>
<li>No chart is shown if a metric doesn't return any data.</li>
<li>When no time range is explicitly specified in a metric rule, the tool retrieves metric data of the last 7 days.</li>
<li>Added Metrics support for the <strong>Event Hubs</strong>, <strong>Consumer Groups</strong>, <strong>Notification Hubs</strong> and <strong>Relays</strong>.</li>
</ul>
<p style="text-align: center;"><img id="134468" src="https://i1.code.msdn.s-msft.com/windowsapps/service-bus-explorer-f2abca5a/image/file/134468/1/eventhubmetrics01.png" alt="" width="800" /></p>
<p style="text-align: center;"><strong>Event Hub: metric rule definition</strong></p>
<p style="text-align: center;"><img id="134469" src="https://i1.code.msdn.s-msft.com/windowsapps/service-bus-explorer-f2abca5a/image/file/134469/1/eventhubmetrics02.png" alt="" width="800" /></p>
<p style="text-align: center;"><strong>Event Hub: metric data and charts</strong></p>
<p style="text-align: center;"><strong><img id="134470" src="https://i1.code.msdn.s-msft.com/windowsapps/service-bus-explorer-f2abca5a/image/file/134470/1/consumergroupmetrics01.png" alt="" width="800" /> <br /></strong></p>
<p style="text-align: center;"><strong>Consumer Group: metric rule definition</strong></p>
<p style="text-align: center;"><img id="134471" src="https://i1.code.msdn.s-msft.com/windowsapps/service-bus-explorer-f2abca5a/image/file/134471/1/consumergroupmetrics02.png" alt="" width="800" /></p>
<p style="text-align: center;"><strong>Consumer Group:&nbsp; metric data and charts</strong></p>
<p style="text-align: center;"><img id="134472" src="https://i1.code.msdn.s-msft.com/windowsapps/service-bus-explorer-f2abca5a/image/file/134472/1/notificationhubmetrics01.png" alt="" width="800" /></p>
<p style="text-align: center;"><strong>Notification Hub: <strong>metric rule definition</strong></strong></p>
<p style="text-align: center;"><img id="134473" src="https://i1.code.msdn.s-msft.com/windowsapps/service-bus-explorer-f2abca5a/image/file/134473/1/notificationhubmetrics02.png" alt="" width="800" /></p>
<p style="text-align: center;"><strong><strong><strong><strong>Notification Hub: </strong>metric data and charts</strong> <br /></strong></strong></p>
<p style="text-align: center;"><img id="134474" src="https://i1.code.msdn.s-msft.com/windowsapps/service-bus-explorer-f2abca5a/image/file/134474/1/relaymetrics01.png" alt="" width="800" /></p>
<p style="text-align: center;"><strong>Relay: <strong>metric rule definition</strong></strong></p>
<p style="text-align: center;">&nbsp;<img id="134475" src="https://i1.code.msdn.s-msft.com/windowsapps/service-bus-explorer-f2abca5a/image/file/134475/1/relaymetrics02.png" alt="" width="800" /></p>
<p style="text-align: center;"><strong><strong>Relay: </strong>metric data and charts</strong></p>
<ul>
<li>If you right click the namespace node in treeview and select <strong>Open Metrics in SDI or MDI mode</strong>, you can access a dialog where you can select metrics of different entities. For example, this option allows to compare the throughput of an event hub with the throughput of one of its consumer groups.</li>
</ul>
<p style="text-align: center;"><img id="134476" src="https://i1.code.msdn.s-msft.com/windowsapps/service-bus-explorer-f2abca5a/image/file/134476/1/namespacemetrics01.png" alt="" width="800" /></p>
<p style="text-align: center;"><strong>Namespace: <strong>metric rule definition</strong></strong></p>
<p style="text-align: center;"><img id="134477" src="https://i1.code.msdn.s-msft.com/windowsapps/service-bus-explorer-f2abca5a/image/file/134477/1/namespacemetrics02.png" alt="" width="800" /></p>
<p style="text-align: center;"><strong><strong><strong>Namespace: metric data and charts</strong> <br /></strong></strong></p>
<ul>
<li>Bug fixed by the developer community on <a href="https://github.com/paolosalvatori/ServiceBusExplorer">GitHub</a> (thanks guys!):</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>Service Bus Explorer 2.5 now available!</title>
      <link>https://docs.microsoft.com/archive/blogs/paolos/service-bus-explorer-2-5-now-available</link>
      <pubDate>Thu, 04 Dec 2014 04:05:20 GMT</pubDate>
      <dc:creator><![CDATA[Paolo Salvatori]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/paolos/2014/12/04/service-bus-explorer-2-5-now-available/</guid>
      <description><![CDATA[I just released an improved version of the Service Bus Explorer tool based on the...]]></description>
      <content:encoded><![CDATA[<p>I just released an improved version of the Service Bus Explorer tool based on the <a href="http://www.nuget.org/packages/WindowsAzure.ServiceBus/">Microsoft.ServiceBus.dll</a> 2.5.3.0.</p>  <p>The zip file contains: </p>  <ul>   <li>The source code for the Service Bus Explorer 2.5.2.0. This version of the tool uses the <a href="http://www.nuget.org/packages/WindowsAzure.ServiceBus/">Microsoft.ServiceBus.dll</a> 2.5.3.0 that is compatible with the current version of the Windows Azure Service Bus, but not with the Service Bus 1.1, that is, the current version of the on-premises version of the Service Bus. </li>    <li>The Service Bus Explorer 2.1.3.0. This version can be used with the Service Bus 1.1. The Service Bus Explorer 2.1 uses the <a href="http://www.nuget.org/packages/WindowsAzure.ServiceBus/">Microsoft.ServiceBus.dll</a> client library which is compatible with the Service Bus for Windows Server 1.1 RTM version. You can download the source code of the Service Bus Explorer 2.1.3 from my <a href="http://1drv.ms/1nEl7ps">OneDrive</a>. </li>    <li>The Service Bus Explorer 1.8. This version can be used with the Service Bus 1.0</li> </ul>  <p>This version introduces the following updates:</p>  <ul>   <li>Updated <strong>Microsoft.ServiceBus.dll to version 2.5.3.0</strong>. </li>    <li>Added support for the <strong>EnableExpress </strong>property of queues and topics: </li> </ul>  <p style="text-align: center;"><img id="130735" alt="" src="https://i1.code.msdn.s-msft.com/windowsazure/service-bus-explorer-f2abca5a/image/file/130781/1/enableexpress.png" width="800" /></p>  <ul>   <li>The following bug has been fixed:      <ol>       <li>Go to a topic with two or more enabled subscriptions. All the subscription icons show enabled state. </li>        <li>Right click one subscription and click 'Disable Subscription', icon shows disabled state. </li>        <li>Go to parent 'Subscriptions' node and 'Refresh': the disabled subscription shows an *enabled* icon even though it is disabled. </li>     </ol>   </li>    <li>The logging mechanism in the <strong>PartitionListernerControl </strong>has been highly improved. Now logging stops as soon as the user clicks the <strong>Stop </strong>or <strong>Close </strong>button in the <strong>Consumer Group </strong>and <strong>Partition Listener </strong>dialog. </li> </ul>  <p style="text-align: center;"><img id="130736" alt="" src="https://i1.code.msdn.s-msft.com/windowsazure/service-bus-explorer-f2abca5a/image/file/130736/1/logging.png" width="800" /></p>  <ul>   <li>The code of the <strong>Consumer Group </strong>and<strong> Partition Listener</strong> has been dramatically improved: </li>    <li>The tool now uses the <strong>EventProcessorFactory</strong>&lt;T&gt; : <a href="http://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.ieventprocessorfactory.aspx">IEventProcessorFactory</a> class for creating instances of the <strong>EventProcessor </strong>: <a href="http://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.ieventprocessor.aspx">IEventProcessor</a> class that are used to process events from event hub partitions. </li>    <li>The tool provides a custom checkpoint manager class: EventProcessorCheckpointManager : <a href="http://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.icheckpointmanager.aspx">ICheckpointManager</a>. In order to use the client-side checkpoint mechanism introduced by the tool, make sure to check the <strong>Checkpoint</strong> control in the <strong>Consumer Group </strong>and <strong>Partition Listener </strong>dialog as shown in the picture below. </li> </ul>  <p style="text-align: center;"><img id="130739" alt="" src="https://i1.code.msdn.s-msft.com/windowsazure/service-bus-explorer-f2abca5a/image/file/130739/1/checkpoint.png" width="800" /></p>  <ul>   <li>The application uses the checkpoint manager to perform checkpoints in the in-process memory and persists checkpoints to a JSON file at the exit. At the start, the application reads checkpoints from the <strong>EventHubPartitionCheckpoints.json</strong> file located in the same directory of the tool. To remove all checkpoints, it's sufficient to delete the file. You can also open the file and selectively delete checkpoints for specific event hub partitions. </li> </ul>  <div class="scriptcode">   <div class="pluginEditHolder" plugincommand="mceScriptCode">     <div id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:d0b98770-7def-41e0-93f4-9c211321bab2" class="wlWriterEditableSmartContent" style="margin: 0px; padding: 0px; float: none; display: inline;"><pre style="background-color:#FFFFFF;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;overflow: auto;"><span style="color: #000000;">[ 
  { 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">namespace</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">eventhubs</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">eventHub</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">basicsampleeventhub</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">leases</span><span style="color: #000000;">"</span><span style="color: #000000;">: { 
      </span><span style="color: #000000;">"</span><span style="color: #000000;">0</span><span style="color: #000000;">"</span><span style="color: #000000;">: { 
        </span><span style="color: #000000;">"</span><span style="color: #000000;">PartitionId</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">0</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
        </span><span style="color: #000000;">"</span><span style="color: #000000;">Owner</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">ServiceBusExplorer</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
        </span><span style="color: #000000;">"</span><span style="color: #000000;">Token</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #0000FF;">null</span><span style="color: #000000;">, 
        </span><span style="color: #000000;">"</span><span style="color: #000000;">Epoch</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">0</span><span style="color: #000000;">, 
        </span><span style="color: #000000;">"</span><span style="color: #000000;">Offset</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">244712</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
        </span><span style="color: #000000;">"</span><span style="color: #000000;">SequenceNumber</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">1699</span><span style="color: #000000;"> 
      }, 
      </span><span style="color: #000000;">"</span><span style="color: #000000;">1</span><span style="color: #000000;">"</span><span style="color: #000000;">: { 
        </span><span style="color: #000000;">"</span><span style="color: #000000;">PartitionId</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">1</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
        </span><span style="color: #000000;">"</span><span style="color: #000000;">Owner</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">ServiceBusExplorer</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
        </span><span style="color: #000000;">"</span><span style="color: #000000;">Token</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #0000FF;">null</span><span style="color: #000000;">, 
        </span><span style="color: #000000;">"</span><span style="color: #000000;">Epoch</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">0</span><span style="color: #000000;">, 
        </span><span style="color: #000000;">"</span><span style="color: #000000;">Offset</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">127416</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
        </span><span style="color: #000000;">"</span><span style="color: #000000;">SequenceNumber</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">885</span><span style="color: #000000;"> 
      }, 
      </span><span style="color: #000000;">"</span><span style="color: #000000;">7</span><span style="color: #000000;">"</span><span style="color: #000000;">: { 
        </span><span style="color: #000000;">"</span><span style="color: #000000;">PartitionId</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">7</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
        </span><span style="color: #000000;">"</span><span style="color: #000000;">Owner</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">ServiceBusExplorer</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
        </span><span style="color: #000000;">"</span><span style="color: #000000;">Token</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #0000FF;">null</span><span style="color: #000000;">, 
        </span><span style="color: #000000;">"</span><span style="color: #000000;">Epoch</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">0</span><span style="color: #000000;">, 
        </span><span style="color: #000000;">"</span><span style="color: #000000;">Offset</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">335176</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
        </span><span style="color: #000000;">"</span><span style="color: #000000;">SequenceNumber</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">2327</span><span style="color: #000000;"> 
      }, 
      </span><span style="color: #000000;">"</span><span style="color: #000000;">2</span><span style="color: #000000;">"</span><span style="color: #000000;">: { 
        </span><span style="color: #000000;">"</span><span style="color: #000000;">PartitionId</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">2</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
        </span><span style="color: #000000;">"</span><span style="color: #000000;">Owner</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">ServiceBusExplorer</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
        </span><span style="color: #000000;">"</span><span style="color: #000000;">Token</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #0000FF;">null</span><span style="color: #000000;">, 
        </span><span style="color: #000000;">"</span><span style="color: #000000;">Epoch</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">0</span><span style="color: #000000;">, 
        </span><span style="color: #000000;">"</span><span style="color: #000000;">Offset</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">86152</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
        </span><span style="color: #000000;">"</span><span style="color: #000000;">SequenceNumber</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">599</span><span style="color: #000000;"> 
      }, 
      </span><span style="color: #000000;">"</span><span style="color: #000000;">4</span><span style="color: #000000;">"</span><span style="color: #000000;">: { 
        </span><span style="color: #000000;">"</span><span style="color: #000000;">PartitionId</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">4</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
        </span><span style="color: #000000;">"</span><span style="color: #000000;">Owner</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">ServiceBusExplorer</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
        </span><span style="color: #000000;">"</span><span style="color: #000000;">Token</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #0000FF;">null</span><span style="color: #000000;">, 
        </span><span style="color: #000000;">"</span><span style="color: #000000;">Epoch</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">0</span><span style="color: #000000;">, 
        </span><span style="color: #000000;">"</span><span style="color: #000000;">Offset</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">238264</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
        </span><span style="color: #000000;">"</span><span style="color: #000000;">SequenceNumber</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">1654</span><span style="color: #000000;"> 
      }, 
      </span><span style="color: #000000;">"</span><span style="color: #000000;">3</span><span style="color: #000000;">"</span><span style="color: #000000;">: { 
        </span><span style="color: #000000;">"</span><span style="color: #000000;">PartitionId</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">3</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
        </span><span style="color: #000000;">"</span><span style="color: #000000;">Owner</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">ServiceBusExplorer</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
        </span><span style="color: #000000;">"</span><span style="color: #000000;">Token</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #0000FF;">null</span><span style="color: #000000;">, 
        </span><span style="color: #000000;">"</span><span style="color: #000000;">Epoch</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">0</span><span style="color: #000000;">, 
        </span><span style="color: #000000;">"</span><span style="color: #000000;">Offset</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">-1</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
        </span><span style="color: #000000;">"</span><span style="color: #000000;">SequenceNumber</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">0</span><span style="color: #000000;"> 
      }, 
      </span><span style="color: #000000;">"</span><span style="color: #000000;">5</span><span style="color: #000000;">"</span><span style="color: #000000;">: { 
        </span><span style="color: #000000;">"</span><span style="color: #000000;">PartitionId</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">5</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
        </span><span style="color: #000000;">"</span><span style="color: #000000;">Owner</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">ServiceBusExplorer</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
        </span><span style="color: #000000;">"</span><span style="color: #000000;">Token</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #0000FF;">null</span><span style="color: #000000;">, 
        </span><span style="color: #000000;">"</span><span style="color: #000000;">Epoch</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">0</span><span style="color: #000000;">, 
        </span><span style="color: #000000;">"</span><span style="color: #000000;">Offset</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">-1</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
        </span><span style="color: #000000;">"</span><span style="color: #000000;">SequenceNumber</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">0</span><span style="color: #000000;"> 
      }, 
      </span><span style="color: #000000;">"</span><span style="color: #000000;">6</span><span style="color: #000000;">"</span><span style="color: #000000;">: { 
        </span><span style="color: #000000;">"</span><span style="color: #000000;">PartitionId</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">6</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
        </span><span style="color: #000000;">"</span><span style="color: #000000;">Owner</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">ServiceBusExplorer</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
        </span><span style="color: #000000;">"</span><span style="color: #000000;">Token</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #0000FF;">null</span><span style="color: #000000;">, 
        </span><span style="color: #000000;">"</span><span style="color: #000000;">Epoch</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">0</span><span style="color: #000000;">, 
        </span><span style="color: #000000;">"</span><span style="color: #000000;">Offset</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">-1</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
        </span><span style="color: #000000;">"</span><span style="color: #000000;">SequenceNumber</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">0</span><span style="color: #000000;"> 
      } 
    } 
  } 
]</span></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --></div>
  </div>
</div>

<ul>
  <li>This version of the tool introduces the possibility to send events directly to a specific event hub partition using the <a href="http://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.eventhubsender.aspx">EventHubSender</a> class.&#160; </li>

  <li>A bug affecting the dimension of the controls in the <strong>Messages </strong> and <strong>Deadletter Messages </strong>dialogs for queues and subscriptions has been fixed. To send messages to a specific event hub partition, right click a partition and choose <strong>Send Events</strong> as shown in the picture below. </li>
</ul>

<p><img id="130740" style="margin-right: auto; margin-left: auto; display: block;" alt="" src="https://i1.code.msdn.s-msft.com/windowsazure/service-bus-explorer-f2abca5a/image/file/130740/1/sendtopartition.png" width="600" /></p>

<ul>
  <li>When you send messages to a specific partition, the <a href="http://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.eventdata.partitionkey.aspx">EventData.PartitionKey</a> property is ignored. For this reason, the <strong>Update PartitionKey</strong> and <strong>No PartitionKey</strong> checkboxes are not available when sending messages to a given event hub partition. </li>
</ul>

<p><img id="130741" alt="" src="https://i1.code.msdn.s-msft.com/windowsazure/service-bus-explorer-f2abca5a/image/file/130741/1/nonopartitionkey.png" width="800" /></p>

<ul>
  <li>When a queue or subscription is partitioned, now the tool invokes the <a href="http://msdn.microsoft.com/en-us/library/jj908731.aspx">MessageReceiver.Peek</a> and <a href="http://msdn.microsoft.com/en-us/library/hh181919.aspx">MessageReceiver.Receive</a> methods respectively, to peek and read messages one by one from the current queue, subscription or deadletter queue, instead of using the <a href="http://msdn.microsoft.com/en-us/library/jj908766.aspx">MessageReceiver.PeekBatch</a> or <a href="http://msdn.microsoft.com/en-us/library/jj673067.aspx">MessageReceiver.ReceiveBatch</a> methods. In fact, when the entity is partitioned, the batch methods read messages only from a single partition, hence they don't return all the messages from the 16 partitions or fragments that form the entity. </li>

  <li>Fxed the value shown by the <strong>Max Size in Gigabytes</strong> slider when the queue or topic is partitioned. In fact, when the queue or subscription is partitioned, the <a href="http://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.queuedescription.maxsizeinmegabytes.aspx">QueueDescription.MaxSizeInMegabytes</a> and <a href="http://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.topicdescription.maxsizeinmegabytes.aspx">TopicDescription.MaxSizeInMegabytes</a> property contains the size you specified when you created the entity (1024;2048;3072;4096;5120) multiplied by 16, that is, the number of fragments that compose the partitioned entity. </li>

  <li>Fixed a problem that happened when updating the value of the ForwardTo and ForwardDeadLetteredMessagesTo properties of a subscription. </li>

  <li>This version of the <strong>Service Bus Explorer </strong>introduces the possibility to save individual or multiple messages to a file in <strong>JSON</strong> format. See below for details. </li>

  <li>In the <strong>Messages </strong>or <strong>Deadletter </strong>tab of a queue or subscription you can save a single message to a JSON file: right click the message to open the context menu and click <strong>Save Selected Message </strong>as shown in the picture below. 

    <br /><img id="130744" style="margin-right: auto; margin-left: auto; display: block;" alt="" src="https://i1.code.msdn.s-msft.com/windowsazure/service-bus-explorer-f2abca5a/image/file/130744/1/saveselectedmessage.png" width="800" />

    <br />&#160; This opens the <strong>Save File As</strong> dialog as shown in the picture below. 

    <br /><img id="130745" style="margin-right: auto; margin-left: auto; display: block;" alt="" src="https://i1.code.msdn.s-msft.com/windowsazure/service-bus-explorer-f2abca5a/image/file/130745/1/savedialogmessage.png" width="800" />

    <br /> The JSON file contains the body and properties of the selected <a href="http://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.brokeredmessage.aspx">BrokeredMessage</a> object. Properties are in camel case. 

    <br />

    <div class="scriptcode">
      <div class="pluginEditHolder" plugincommand="mceScriptCode">
        <div id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:2fac9e72-60b2-4d32-8b8f-2a7dbd102d79" class="wlWriterEditableSmartContent" style="margin: 0px; padding: 0px; float: none; display: inline;"><pre style="background-color:#FFFFFF;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;overflow: auto;"><span style="color: #000000;">{</span><span style="color: #000000;">"</span><span style="color: #000000;">body</span><span style="color: #000000;">"</span><span style="color: #000000;">: {</span><span style="color: #000000;">"</span><span style="color: #000000;">deviceid</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">84</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">value</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">68</span><span style="color: #000000;">}, 
  </span><span style="color: #000000;">"</span><span style="color: #000000;">contentType</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #0000FF;">null</span><span style="color: #000000;">, 
  </span><span style="color: #000000;">"</span><span style="color: #000000;">correlationId</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #0000FF;">null</span><span style="color: #000000;">, 
  </span><span style="color: #000000;">"</span><span style="color: #000000;">deliveryCount</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">1</span><span style="color: #000000;">, 
  </span><span style="color: #000000;">"</span><span style="color: #000000;">enqueuedSequenceNumber</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">1</span><span style="color: #000000;">, 
  </span><span style="color: #000000;">"</span><span style="color: #000000;">enqueuedTimeUtc</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">2014-12-03T16:39:48.4958476Z</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
  </span><span style="color: #000000;">"</span><span style="color: #000000;">expiresAtUtc</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">9999-12-31T23:59:59.9999999</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
  </span><span style="color: #000000;">"</span><span style="color: #000000;">forcePersistence</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #0000FF;">false</span><span style="color: #000000;">, 
  </span><span style="color: #000000;">"</span><span style="color: #000000;">isBodyConsumed</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #0000FF;">false</span><span style="color: #000000;">, 
  </span><span style="color: #000000;">"</span><span style="color: #000000;">isLargeMessage</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #0000FF;">false</span><span style="color: #000000;">, 
  </span><span style="color: #000000;">"</span><span style="color: #000000;">label</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">Service Bus Explorer</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
  </span><span style="color: #000000;">"</span><span style="color: #000000;">lockedUntilUtc</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #0000FF;">null</span><span style="color: #000000;">, 
  </span><span style="color: #000000;">"</span><span style="color: #000000;">lockToken</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #0000FF;">null</span><span style="color: #000000;">, 
  </span><span style="color: #000000;">"</span><span style="color: #000000;">messageId</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">5cbc08aa-dca5-434b-bc27-afc8ba98307f</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
  </span><span style="color: #000000;">"</span><span style="color: #000000;">partitionKey</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">18</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
  </span><span style="color: #000000;">"</span><span style="color: #000000;">properties</span><span style="color: #000000;">"</span><span style="color: #000000;">: {</span><span style="color: #000000;">"</span><span style="color: #000000;">deviceId</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">84</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">value</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">68</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">time</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">635532215878943345</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">city</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">Milan</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">country</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">Italy</span><span style="color: #000000;">"</span><span style="color: #000000;">}, 
  </span><span style="color: #000000;">"</span><span style="color: #000000;">replyTo</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #0000FF;">null</span><span style="color: #000000;">, 
  </span><span style="color: #000000;">"</span><span style="color: #000000;">replyToSessionId</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #0000FF;">null</span><span style="color: #000000;">, 
  </span><span style="color: #000000;">"</span><span style="color: #000000;">scheduledEnqueueTimeUtc</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">0001-01-01T00:00:00</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
  </span><span style="color: #000000;">"</span><span style="color: #000000;">sequenceNumber</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">281474976710657</span><span style="color: #000000;">, 
  </span><span style="color: #000000;">"</span><span style="color: #000000;">sessionId</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #0000FF;">null</span><span style="color: #000000;">, 
  </span><span style="color: #000000;">"</span><span style="color: #000000;">size</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">229</span><span style="color: #000000;">, 
  </span><span style="color: #000000;">"</span><span style="color: #000000;">state</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">0</span><span style="color: #000000;">, 
  </span><span style="color: #000000;">"</span><span style="color: #000000;">timeToLive</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">10675199.02:48:05.4775807</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
  </span><span style="color: #000000;">"</span><span style="color: #000000;">to</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #0000FF;">null</span><span style="color: #000000;">, 
  </span><span style="color: #000000;">"</span><span style="color: #000000;">viaPartitionKey</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #0000FF;">null</span><span style="color: #000000;"> 
}</span></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --></div>
      </div>
    </div>
  </li>

  <li>As an alternative, you can double click a message in the <strong>Messages </strong> or <strong>Deadletter </strong>tab for queue or subscription to open the <strong> Repair and Resubmit Message</strong> dialog and then click the <strong>Save </strong> button as shown in the picture below. </li>
</ul>

<p><img id="130746" alt="" src="https://i1.code.msdn.s-msft.com/windowsazure/service-bus-explorer-f2abca5a/image/file/130746/1/repairandresubmitmessage.png" width="800" /></p>

<ul>
  <li>In the <strong>Messages </strong>or <strong>Deadletter </strong>tab of a queue or subscription you can save multiple messages to a JSON file: select multiple messages and right click one of them to open the context menu and then click <strong>Save Selected Messages </strong>as shown in the picture below. 

    <br /><img id="130748" alt="" src="https://i1.code.msdn.s-msft.com/windowsazure/service-bus-explorer-f2abca5a/image/file/130748/1/saveselectedmessages.png" width="800" /> 

    <br />&#160; This opens the <strong>Save File As</strong> dialog as shown in the picture below. 

    <br /><img id="130745" style="margin-right: auto; margin-left: auto; display: block;" alt="" src="https://i1.code.msdn.s-msft.com/windowsazure/service-bus-explorer-f2abca5a/image/file/130745/1/savedialogmessage.png" width="800" />

    <br /> The JSON file contains an array of items. Each item contains the body and properties of one of the selected <a href="http://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.brokeredmessage.aspx">BrokeredMessage</a> objects. Properties are in camel case. 

    <br />

    <div class="scriptcode">
      <div class="pluginEditHolder" plugincommand="mceScriptCode">
        <div id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:c6c17a99-8169-42d3-806c-8139ce4e1455" class="wlWriterEditableSmartContent" style="margin: 0px; padding: 0px; float: none; display: inline;"><pre style="background-color:#FFFFFF;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;overflow: auto;"><span style="color: #000000;">[ 
  {</span><span style="color: #000000;">"</span><span style="color: #000000;">body</span><span style="color: #000000;">"</span><span style="color: #000000;">: {</span><span style="color: #000000;">"</span><span style="color: #000000;">deviceid</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">36</span><span style="color: #000000;">, 
      </span><span style="color: #000000;">"</span><span style="color: #000000;">value</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">93</span><span style="color: #000000;">}, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">contentType</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #0000FF;">null</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">correlationId</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #0000FF;">null</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">deliveryCount</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">1</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">enqueuedSequenceNumber</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">1</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">enqueuedTimeUtc</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">2014-12-03T16:39:48.7794889Z</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">expiresAtUtc</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">9999-12-31T23:59:59.9999999</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">forcePersistence</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #0000FF;">false</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">isBodyConsumed</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #0000FF;">false</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">isLargeMessage</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #0000FF;">false</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">label</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">Service Bus Explorer</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">lockedUntilUtc</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #0000FF;">null</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">lockToken</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #0000FF;">null</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">messageId</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">197c5f6b-635c-437e-b419-5b346b626c35</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">partitionKey</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">0</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">properties</span><span style="color: #000000;">"</span><span style="color: #000000;">: {</span><span style="color: #000000;">"</span><span style="color: #000000;">deviceId</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">36</span><span style="color: #000000;">, 
      </span><span style="color: #000000;">"</span><span style="color: #000000;">value</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">93</span><span style="color: #000000;">, 
      </span><span style="color: #000000;">"</span><span style="color: #000000;">time</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">635532215878943345</span><span style="color: #000000;">, 
      </span><span style="color: #000000;">"</span><span style="color: #000000;">city</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">Milan</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
      </span><span style="color: #000000;">"</span><span style="color: #000000;">country</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">Italy</span><span style="color: #000000;">"</span><span style="color: #000000;">}, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">replyTo</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #0000FF;">null</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">replyToSessionId</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #0000FF;">null</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">scheduledEnqueueTimeUtc</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">0001-01-01T00:00:00</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">sequenceNumber</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">4785074604081153</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">sessionId</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #0000FF;">null</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">size</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">228</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">state</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">0</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">timeToLive</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">10675199.02:48:05.4775807</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">to</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #0000FF;">null</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">viaPartitionKey</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #0000FF;">null</span><span style="color: #000000;"> 
  }, 
  {</span><span style="color: #000000;">"</span><span style="color: #000000;">body</span><span style="color: #000000;">"</span><span style="color: #000000;">: {</span><span style="color: #000000;">"</span><span style="color: #000000;">deviceid</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">85</span><span style="color: #000000;">, 
      </span><span style="color: #000000;">"</span><span style="color: #000000;">value</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">29</span><span style="color: #000000;">}, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">contentType</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #0000FF;">null</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">correlationId</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #0000FF;">null</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">deliveryCount</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">1</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">enqueuedSequenceNumber</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">2</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">enqueuedTimeUtc</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">2014-12-03T16:39:56.5925297Z</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">expiresAtUtc</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">9999-12-31T23:59:59.9999999</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">forcePersistence</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #0000FF;">false</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">isBodyConsumed</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #0000FF;">false</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">isLargeMessage</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #0000FF;">false</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">label</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">Service Bus Explorer</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">lockedUntilUtc</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #0000FF;">null</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">lockToken</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #0000FF;">null</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">messageId</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">fa9482b5-6dff-4268-9a5c-3d9b08bb358c</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">partitionKey</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">942</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">properties</span><span style="color: #000000;">"</span><span style="color: #000000;">: {</span><span style="color: #000000;">"</span><span style="color: #000000;">deviceId</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">85</span><span style="color: #000000;">, 
      </span><span style="color: #000000;">"</span><span style="color: #000000;">value</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">29</span><span style="color: #000000;">, 
      </span><span style="color: #000000;">"</span><span style="color: #000000;">time</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">635532215962583503</span><span style="color: #000000;">, 
      </span><span style="color: #000000;">"</span><span style="color: #000000;">city</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">Milan</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
      </span><span style="color: #000000;">"</span><span style="color: #000000;">country</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">Italy</span><span style="color: #000000;">"</span><span style="color: #000000;">}, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">replyTo</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #0000FF;">null</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">replyToSessionId</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #0000FF;">null</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">scheduledEnqueueTimeUtc</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">0001-01-01T00:00:00</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">sequenceNumber</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">562949953421314</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">sessionId</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #0000FF;">null</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">size</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">230</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">state</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">0</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">timeToLive</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">10675199.02:48:05.4775807</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">to</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #0000FF;">null</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">viaPartitionKey</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #0000FF;">null</span><span style="color: #000000;"> 
  }, 
  {</span><span style="color: #000000;">"</span><span style="color: #000000;">body</span><span style="color: #000000;">"</span><span style="color: #000000;">: {</span><span style="color: #000000;">"</span><span style="color: #000000;">deviceid</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">84</span><span style="color: #000000;">, 
      </span><span style="color: #000000;">"</span><span style="color: #000000;">value</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">68</span><span style="color: #000000;">}, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">contentType</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #0000FF;">null</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">correlationId</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #0000FF;">null</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">deliveryCount</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">1</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">enqueuedSequenceNumber</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">1</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">enqueuedTimeUtc</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">2014-12-03T16:39:48.4958476Z</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">expiresAtUtc</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">9999-12-31T23:59:59.9999999</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">forcePersistence</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #0000FF;">false</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">isBodyConsumed</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #0000FF;">false</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">isLargeMessage</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #0000FF;">false</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">label</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">Service Bus Explorer</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">lockedUntilUtc</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #0000FF;">null</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">lockToken</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #0000FF;">null</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">messageId</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">5cbc08aa-dca5-434b-bc27-afc8ba98307f</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">partitionKey</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">18</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">properties</span><span style="color: #000000;">"</span><span style="color: #000000;">: {</span><span style="color: #000000;">"</span><span style="color: #000000;">deviceId</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">84</span><span style="color: #000000;">, 
      </span><span style="color: #000000;">"</span><span style="color: #000000;">value</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">68</span><span style="color: #000000;">, 
      </span><span style="color: #000000;">"</span><span style="color: #000000;">time</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">635532215878943345</span><span style="color: #000000;">, 
      </span><span style="color: #000000;">"</span><span style="color: #000000;">city</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">Milan</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
      </span><span style="color: #000000;">"</span><span style="color: #000000;">country</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">Italy</span><span style="color: #000000;">"</span><span style="color: #000000;">}, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">replyTo</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #0000FF;">null</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">replyToSessionId</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #0000FF;">null</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">scheduledEnqueueTimeUtc</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">0001-01-01T00:00:00</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">sequenceNumber</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">281474976710657</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">sessionId</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #0000FF;">null</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">size</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">229</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">state</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">0</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">timeToLive</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">10675199.02:48:05.4775807</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">to</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #0000FF;">null</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">viaPartitionKey</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #0000FF;">null</span><span style="color: #000000;"> 
  } 
]</span></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --></div>
      </div>
    </div>
  </li>
</ul>

<ul>
  <li>In the <strong>Consumer Group or Partition Listener</strong> dialog you can save a single event to a JSON file: right click the event under the <strong>Events</strong> tab to open the context menu and click <strong>Save Selected Event </strong>as shown in the picture below. 

    <br /><img id="130753" style="display: block;" alt="" src="https://i1.code.msdn.s-msft.com/windowsazure/service-bus-explorer-f2abca5a/image/file/130753/1/saveselectedevent.png" width="800" />

    <br />&#160; This opens the <strong>Save File As</strong> dialog as shown in the picture below. 

    <br /><img id="130754" style="margin-right: auto; margin-left: auto; display: block;" alt="" src="https://i1.code.msdn.s-msft.com/windowsazure/service-bus-explorer-f2abca5a/image/file/130754/1/savedialogevent.png" width="800" />

    <br /> The JSON file contains the body and properties of the selected <a href="http://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.eventdata.aspx">EventData</a> object. Properties are in camel case. 

    <br />

    <div class="scriptcode">
      <div class="pluginEditHolder" plugincommand="mceScriptCode">
        <div id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:03cc1a52-b598-42b4-b62c-6a2c3c251452" class="wlWriterEditableSmartContent" style="margin: 0px; padding: 0px; float: none; display: inline;"><pre style="background-color:#FFFFFF;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;overflow: auto;"><span style="color: #000000;">{ 
  </span><span style="color: #000000;">"</span><span style="color: #000000;">body</span><span style="color: #000000;">"</span><span style="color: #000000;">: { 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">deviceid</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">6</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">name</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">device006</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">value</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">50</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">location</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">Milan</span><span style="color: #000000;">"</span><span style="color: #000000;"> 
  }, 
  </span><span style="color: #000000;">"</span><span style="color: #000000;">enqueuedTimeUtc</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">2014-11-06T17:18:01.057Z</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
  </span><span style="color: #000000;">"</span><span style="color: #000000;">offset</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">208</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
  </span><span style="color: #000000;">"</span><span style="color: #000000;">partitionKey</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">device006</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
  </span><span style="color: #000000;">"</span><span style="color: #000000;">properties</span><span style="color: #000000;">"</span><span style="color: #000000;">: { 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">id</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">6</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">name</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">device006</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">location</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">Milan</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">value</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">50</span><span style="color: #000000;"> 
  }, 
  </span><span style="color: #000000;">"</span><span style="color: #000000;">sequenceNumber</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">1</span><span style="color: #000000;">, 
  </span><span style="color: #000000;">"</span><span style="color: #000000;">systemProperties</span><span style="color: #000000;">"</span><span style="color: #000000;">: { 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">Publisher</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">device006</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">PartitionKey</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">device006</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">EnqueuedTimeUtc</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">2014-11-06T17:18:01.057Z</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">SequenceNumber</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">1</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">Offset</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">208</span><span style="color: #000000;">"</span><span style="color: #000000;"> 
  } 
} </span></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --></div>
      </div>
    </div>
  </li>
</ul>

<ul>
  <li>As an alternative, you can double click an event in the <strong>Consumer Group or Partition Listener</strong> dialog to open the <strong>View Event Data</strong> dialog and then click the <strong>Save </strong>button as shown in the picture below. </li>
</ul>

<p style="text-align: center;"><img id="130757" alt="" src="https://i1.code.msdn.s-msft.com/windowsazure/service-bus-explorer-f2abca5a/image/file/130757/1/saveevent.png" width="800" /></p>

<ul>
  <li>In the <strong>Consumer Group or Partition Listener</strong> dialog you can save multiple events to a JSON file: select multiple events and right click one of them to open the context menu and then click <strong>Save Selected Events </strong>as shown in the picture below.&#160; <br /><img id="130759" style="display: block;" alt="" src="https://i1.code.msdn.s-msft.com/windowsazure/service-bus-explorer-f2abca5a/image/file/130759/1/saveselectedevents.png" width="800" />

    <br />&#160; This opens the <strong>Save File As</strong> dialog as shown in the picture below. 

    <br /><img id="130760" style="display: block;" alt="" src="https://i1.code.msdn.s-msft.com/windowsazure/service-bus-explorer-f2abca5a/image/file/130760/1/savedialogevent.png" width="800" />

    <br /> The JSON file contains an array of items. Each item contains the body and properties of one of the selected <a href="http://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.eventdata.aspx">EventData</a> objects. Properties are in camel case.&#160; <br />

    <div class="scriptcode">
      <div class="pluginEditHolder" plugincommand="mceScriptCode">
        <div id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:1100db63-a6c9-455f-9ae6-a1b173493eec" class="wlWriterEditableSmartContent" style="margin: 0px; padding: 0px; float: none; display: inline;"><pre style="background-color:#FFFFFF;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;overflow: auto;"><span style="color: #000000;">[ 
  { 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">body</span><span style="color: #000000;">"</span><span style="color: #000000;">: { 
      </span><span style="color: #000000;">"</span><span style="color: #000000;">deviceid</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">6</span><span style="color: #000000;">, 
      </span><span style="color: #000000;">"</span><span style="color: #000000;">name</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">device006</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
      </span><span style="color: #000000;">"</span><span style="color: #000000;">value</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">26</span><span style="color: #000000;">, 
      </span><span style="color: #000000;">"</span><span style="color: #000000;">location</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">Milan</span><span style="color: #000000;">"</span><span style="color: #000000;"> 
    }, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">enqueuedTimeUtc</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">2014-11-06T17:18:03.267Z</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">offset</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">624</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">partitionKey</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">device006</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">properties</span><span style="color: #000000;">"</span><span style="color: #000000;">: { 
      </span><span style="color: #000000;">"</span><span style="color: #000000;">id</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">6</span><span style="color: #000000;">, 
      </span><span style="color: #000000;">"</span><span style="color: #000000;">name</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">device006</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
      </span><span style="color: #000000;">"</span><span style="color: #000000;">location</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">Milan</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
      </span><span style="color: #000000;">"</span><span style="color: #000000;">value</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">26</span><span style="color: #000000;"> 
    }, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">sequenceNumber</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">3</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">systemProperties</span><span style="color: #000000;">"</span><span style="color: #000000;">: { 
      </span><span style="color: #000000;">"</span><span style="color: #000000;">Publisher</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">device006</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
      </span><span style="color: #000000;">"</span><span style="color: #000000;">PartitionKey</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">device006</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
      </span><span style="color: #000000;">"</span><span style="color: #000000;">EnqueuedTimeUtc</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">2014-11-06T17:18:03.267Z</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
      </span><span style="color: #000000;">"</span><span style="color: #000000;">SequenceNumber</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">3</span><span style="color: #000000;">, 
      </span><span style="color: #000000;">"</span><span style="color: #000000;">Offset</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">624</span><span style="color: #000000;">"</span><span style="color: #000000;"> 
    } 
  }, 
  { 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">body</span><span style="color: #000000;">"</span><span style="color: #000000;">: { 
      </span><span style="color: #000000;">"</span><span style="color: #000000;">deviceid</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">6</span><span style="color: #000000;">, 
      </span><span style="color: #000000;">"</span><span style="color: #000000;">name</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">device006</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
      </span><span style="color: #000000;">"</span><span style="color: #000000;">value</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">23</span><span style="color: #000000;">, 
      </span><span style="color: #000000;">"</span><span style="color: #000000;">location</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">Milan</span><span style="color: #000000;">"</span><span style="color: #000000;"> 
    }, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">enqueuedTimeUtc</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">2014-11-06T17:18:02.173Z</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">offset</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">416</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">partitionKey</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">device006</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">properties</span><span style="color: #000000;">"</span><span style="color: #000000;">: { 
      </span><span style="color: #000000;">"</span><span style="color: #000000;">id</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">6</span><span style="color: #000000;">, 
      </span><span style="color: #000000;">"</span><span style="color: #000000;">name</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">device006</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
      </span><span style="color: #000000;">"</span><span style="color: #000000;">location</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">Milan</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
      </span><span style="color: #000000;">"</span><span style="color: #000000;">value</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">23</span><span style="color: #000000;"> 
    }, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">sequenceNumber</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">2</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">systemProperties</span><span style="color: #000000;">"</span><span style="color: #000000;">: { 
      </span><span style="color: #000000;">"</span><span style="color: #000000;">Publisher</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">device006</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
      </span><span style="color: #000000;">"</span><span style="color: #000000;">PartitionKey</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">device006</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
      </span><span style="color: #000000;">"</span><span style="color: #000000;">EnqueuedTimeUtc</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">2014-11-06T17:18:02.173Z</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
      </span><span style="color: #000000;">"</span><span style="color: #000000;">SequenceNumber</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">2</span><span style="color: #000000;">, 
      </span><span style="color: #000000;">"</span><span style="color: #000000;">Offset</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">416</span><span style="color: #000000;">"</span><span style="color: #000000;"> 
    } 
  }, 
  { 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">body</span><span style="color: #000000;">"</span><span style="color: #000000;">: { 
      </span><span style="color: #000000;">"</span><span style="color: #000000;">deviceid</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">6</span><span style="color: #000000;">, 
      </span><span style="color: #000000;">"</span><span style="color: #000000;">name</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">device006</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
      </span><span style="color: #000000;">"</span><span style="color: #000000;">value</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">50</span><span style="color: #000000;">, 
      </span><span style="color: #000000;">"</span><span style="color: #000000;">location</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">Milan</span><span style="color: #000000;">"</span><span style="color: #000000;"> 
    }, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">enqueuedTimeUtc</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">2014-11-06T17:18:01.057Z</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">offset</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">208</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">partitionKey</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">device006</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">properties</span><span style="color: #000000;">"</span><span style="color: #000000;">: { 
      </span><span style="color: #000000;">"</span><span style="color: #000000;">id</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">6</span><span style="color: #000000;">, 
      </span><span style="color: #000000;">"</span><span style="color: #000000;">name</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">device006</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
      </span><span style="color: #000000;">"</span><span style="color: #000000;">location</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">Milan</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
      </span><span style="color: #000000;">"</span><span style="color: #000000;">value</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">50</span><span style="color: #000000;"> 
    }, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">sequenceNumber</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">1</span><span style="color: #000000;">, 
    </span><span style="color: #000000;">"</span><span style="color: #000000;">systemProperties</span><span style="color: #000000;">"</span><span style="color: #000000;">: { 
      </span><span style="color: #000000;">"</span><span style="color: #000000;">Publisher</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">device006</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
      </span><span style="color: #000000;">"</span><span style="color: #000000;">PartitionKey</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">device006</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
      </span><span style="color: #000000;">"</span><span style="color: #000000;">EnqueuedTimeUtc</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">2014-11-06T17:18:01.057Z</span><span style="color: #000000;">"</span><span style="color: #000000;">, 
      </span><span style="color: #000000;">"</span><span style="color: #000000;">SequenceNumber</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">1</span><span style="color: #000000;">, 
      </span><span style="color: #000000;">"</span><span style="color: #000000;">Offset</span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;">208</span><span style="color: #000000;">"</span><span style="color: #000000;"> 
    } 
  } 
] </span></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --></div>
      </div>
    </div>
  </li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>How to create Service Bus queues, topics and subscriptions using a PowerShell script</title>
      <link>https://docs.microsoft.com/archive/blogs/paolos/how-to-create-service-bus-queues-topics-and-subscriptions-using-a-powershell-script</link>
      <pubDate>Tue, 02 Dec 2014 10:00:00 GMT</pubDate>
      <dc:creator><![CDATA[Paolo Salvatori]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/paolos/2014/12/02/how-to-create-service-bus-queues-topics-and-subscriptions-using-a-powershell-script/</guid>
      <description><![CDATA[In my previous post How to create a Service Bus Namespace and an Event Hub using a PowerShell script...]]></description>
      <content:encoded><![CDATA[<p align="justify">In my previous post <a href="http://blogs.msdn.com/b/paolos/archive/2014/12/01/how-to-create-a-service-bus-namespace-and-an-event-hub-using-a-powershell-script.aspx">How to create a Service Bus Namespace and an Event Hub using a PowerShell script</a> I provided a PowerShell script to create a Service Bus namespace, an event hub and a custom consumer group. In this post I provide 3 new scripts that you can use to automate the creation of queues, topics and subscriptions:</p>  <h2 align="justify">CreateQueue.ps1</h2>  <p align="justify">This script can be used to create a subscription for an existing queue.</p>  <div id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:09522612-7745-4983-8169-6f4be09b8dfa" class="wlWriterEditableSmartContent" style="margin: 0px; padding: 0px; float: none; display: inline;"><pre style="background-color:#FFFFFF;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;overflow: auto;"><span style="color: #000000;">&lt;</span><span style="color: #008000;">#
</span><span style="color: #000000;">    .SYNOPSIS
    This script can be used to provision a namespace and queue.
            
    .DESCRIPTION
    This script can be used to provision a namespace and a queue. 
    
    .PARAMETER  Path
    Specifies the full path of the queue.

    .PARAMETER  AutoDeleteOnIdle
    Specifies after how many minutes the queue is automatically deleted. The minimum duration is </span><span style="color: #000000;">5</span><span style="color: #000000;"> minutes.

    .PARAMETER  DefaultMessageTimeToLive
    Specifies </span><span style="color: #0000FF;">default</span><span style="color: #000000;"> message time to live value </span><span style="color: #0000FF;">in</span><span style="color: #000000;"> minutes. This is the duration after which the message expires, 
    starting from when the message is sent to Service Bus. This is the </span><span style="color: #0000FF;">default</span><span style="color: #000000;"> value used when TimeToLive is not set on a message itself.
    Messages older than their TimeToLive value will expire and no longer be retained </span><span style="color: #0000FF;">in</span><span style="color: #000000;"> the message store. 
    Subscribers will be unable to receive expired messages.A message can have a lower TimeToLive value than that specified here, 
    but by </span><span style="color: #0000FF;">default</span><span style="color: #000000;"> TimeToLive is set to MaxValue. Therefore, this property becomes the </span><span style="color: #0000FF;">default</span><span style="color: #000000;"> time to live value applied to messages.
    
    .PARAMETER  DuplicateDetectionHistoryTimeWindow
    Specifies the duration of the duplicate detection history </span><span style="color: #0000FF;">in</span><span style="color: #000000;"> minutes. The </span><span style="color: #0000FF;">default</span><span style="color: #000000;"> value is </span><span style="color: #000000;">10</span><span style="color: #000000;"> minutes.
    
    .PARAMETER  EnableBatchedOperations
    Specifies whether server</span><span style="color: #000000;">-</span><span style="color: #000000;">side batched operations are enabled.
    
    .PARAMETER  EnableDeadLetteringOnMessageExpiration
    Specifies whether this queue has dead letter support when a message expires.
    
    .PARAMETER  EnableExpress
    Specifies whether to enable the queue to be partitioned across multiple message brokers. 
    An express queue holds a message </span><span style="color: #0000FF;">in</span><span style="color: #000000;"> memory temporarily before writing it to persistent storage.
     
    .PARAMETER  EnablePartitioning
    Specifies whether the queue to be partitioned across multiple message brokers is enabled. 
    
    .PARAMETER  ForwardDeadLetteredMessagesTo
    Specifies the path to the recipient to which the dead lettered message is forwarded.
    
    .PARAMETER  ForwardTo
    Specifies the path to the recipient to which the message is forwarded.
    
    .PARAMETER  IsAnonymousAccessible
    Specifies whether the message is anonymous accessible.

    .PARAMETER  LockDuration
    Specifies the duration of a peek lock </span><span style="color: #0000FF;">in</span><span style="color: #000000;"> seconds; that is, the amount of time that the message is locked </span><span style="color: #0000FF;">for</span><span style="color: #000000;"> other receivers. 
    The maximum value </span><span style="color: #0000FF;">for</span><span style="color: #000000;"> LockDuration is </span><span style="color: #000000;">5</span><span style="color: #000000;"> minutes; the </span><span style="color: #0000FF;">default</span><span style="color: #000000;"> value is </span><span style="color: #000000;">1</span><span style="color: #000000;"> minute.
    
    .PARAMETER  MaxDeliveryCount
    Specifies the maximum delivery count. A message is automatically deadlettered after this number of deliveries.
    
    .PARAMETER  MaxSizeInMegabytes
    Specifies the maximum size of the queue </span><span style="color: #0000FF;">in</span><span style="color: #000000;"> megabytes, which is the size of memory allocated </span><span style="color: #0000FF;">for</span><span style="color: #000000;"> the queue.
    
    .PARAMETER  RequiresDuplicateDetection
    Specifies whether the queue requires duplicate detection.
    
    .PARAMETER  RequiresSession
    Specifies whether the queue supports the concept of session.
    
    .PARAMETER  SupportOrdering
    Specifies whether the queue supports ordering.
    
    .PARAMETER  UserMetadata
    Specifies the user metadata.

    .PARAMETER  Namespace
    Specifies the name of the Service Bus namespace.

    .PARAMETER  CreateACSNamespace
    Specifies whether  to create an ACS namespace associated to the Service Bus namespace.

    .PARAMETER  Location
    Specifies the location to create the namespace </span><span style="color: #0000FF;">in</span><span style="color: #000000;">. The </span><span style="color: #0000FF;">default</span><span style="color: #000000;"> value is </span><span style="color: #800000;">"</span><span style="color: #800000;">West Europe</span><span style="color: #800000;">"</span><span style="color: #000000;">. 

    Valid values:
    </span><span style="color: #000000;">--</span><span style="color: #000000;"> East Asia
    </span><span style="color: #000000;">--</span><span style="color: #000000;"> East US
    </span><span style="color: #000000;">--</span><span style="color: #000000;"> Central US
    </span><span style="color: #000000;">--</span><span style="color: #000000;"> North Central US
    </span><span style="color: #000000;">--</span><span style="color: #000000;"> North Europe
    </span><span style="color: #000000;">--</span><span style="color: #000000;"> West Europe
    </span><span style="color: #000000;">--</span><span style="color: #000000;"> West US
    
    .NOTES  
    Author     : Paolo Salvatori
    Twitter    : </span><span style="color: #000000;">@</span><span style="color: #000000;">babosbird
    Blog       : http:</span><span style="color: #000000;">//</span><span style="color: #000000;">blogs.msdn.com</span><span style="color: #000000;">/</span><span style="color: #000000;">b</span><span style="color: #000000;">/</span><span style="color: #000000;">paolos</span><span style="color: #000000;">/</span><span style="color: #000000;">
</span><span style="color: #008000;">#</span><span style="color: #008000;">&gt;</span><span style="color: #008000;">
</span><span style="color: #000000;">
[CmdletBinding(PositionalBinding</span><span style="color: #000000;">=</span><span style="color: #0000FF;">$True</span><span style="color: #000000;">)]
</span><span style="color: #0000FF;">Param</span><span style="color: #000000;">(
    [Parameter(Mandatory </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">$true</span><span style="color: #000000;">)]
    [ValidatePattern(</span><span style="color: #800000;">"</span><span style="color: #800000;">^[a-z0-9]*$</span><span style="color: #800000;">"</span><span style="color: #000000;">)]
    [String]</span><span style="color: #800080;">$Path</span><span style="color: #000000;">,                                           </span><span style="color: #008000;">#</span><span style="color: #008000;"> required    needs to be alphanumeric    </span><span style="color: #008000;">
</span><span style="color: #000000;">    [Int]</span><span style="color: #800080;">$AutoDeleteOnIdle</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">,                             </span><span style="color: #008000;">#</span><span style="color: #008000;"> optional    default to -1</span><span style="color: #008000;">
</span><span style="color: #000000;">    [Int]</span><span style="color: #800080;">$DefaultMessageTimeToLive</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">,                     </span><span style="color: #008000;">#</span><span style="color: #008000;"> optional    default to -1</span><span style="color: #008000;">
</span><span style="color: #000000;">    [Int]</span><span style="color: #800080;">$DuplicateDetectionHistoryTimeWindow</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">10</span><span style="color: #000000;">,          </span><span style="color: #008000;">#</span><span style="color: #008000;"> optional    default to 10</span><span style="color: #008000;">
</span><span style="color: #000000;">    [Bool]</span><span style="color: #800080;">$EnableBatchedOperations</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">$True</span><span style="color: #000000;">,                  </span><span style="color: #008000;">#</span><span style="color: #008000;"> optional    default to true</span><span style="color: #008000;">
</span><span style="color: #000000;">    [Bool]</span><span style="color: #800080;">$EnableDeadLetteringOnMessageExpiration</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">$False</span><span style="color: #000000;">,  </span><span style="color: #008000;">#</span><span style="color: #008000;"> optional    default to false</span><span style="color: #008000;">
</span><span style="color: #000000;">    [Bool]</span><span style="color: #800080;">$EnableExpress</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">$False</span><span style="color: #000000;">,                           </span><span style="color: #008000;">#</span><span style="color: #008000;"> optional    default to false</span><span style="color: #008000;">
</span><span style="color: #000000;">    [Bool]</span><span style="color: #800080;">$EnablePartitioning</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">$False</span><span style="color: #000000;">,                      </span><span style="color: #008000;">#</span><span style="color: #008000;"> optional    default to false</span><span style="color: #008000;">
</span><span style="color: #000000;">    [String]</span><span style="color: #800080;">$ForwardDeadLetteredMessagesTo</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">$Null</span><span style="color: #000000;">,          </span><span style="color: #008000;">#</span><span style="color: #008000;"> optional    default to null</span><span style="color: #008000;">
</span><span style="color: #000000;">    [String]</span><span style="color: #800080;">$ForwardTo</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">$Null</span><span style="color: #000000;">,                              </span><span style="color: #008000;">#</span><span style="color: #008000;"> optional    default to null</span><span style="color: #008000;">
</span><span style="color: #000000;">    [Bool]</span><span style="color: #800080;">$IsAnonymousAccessible</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">$False</span><span style="color: #000000;">,                   </span><span style="color: #008000;">#</span><span style="color: #008000;"> optional    default to false</span><span style="color: #008000;">
</span><span style="color: #000000;">    [Int]</span><span style="color: #800080;">$LockDuration</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">30</span><span style="color: #000000;">,                                 </span><span style="color: #008000;">#</span><span style="color: #008000;"> optional    default to 30</span><span style="color: #008000;">
</span><span style="color: #000000;">    [Int]</span><span style="color: #800080;">$MaxDeliveryCount</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">10</span><span style="color: #000000;">,                             </span><span style="color: #008000;">#</span><span style="color: #008000;"> optional    default to 10</span><span style="color: #008000;">
</span><span style="color: #000000;">    [Int]</span><span style="color: #800080;">$MaxSizeInMegabytes</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">1024</span><span style="color: #000000;">,                         </span><span style="color: #008000;">#</span><span style="color: #008000;"> optional    default to 1024</span><span style="color: #008000;">
</span><span style="color: #000000;">    [Bool]</span><span style="color: #800080;">$RequiresDuplicateDetection</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">$False</span><span style="color: #000000;">,              </span><span style="color: #008000;">#</span><span style="color: #008000;"> optional    default to false</span><span style="color: #008000;">
</span><span style="color: #000000;">    [Bool]</span><span style="color: #800080;">$RequiresSession</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">$False</span><span style="color: #000000;">,                         </span><span style="color: #008000;">#</span><span style="color: #008000;"> optional    default to false</span><span style="color: #008000;">
</span><span style="color: #000000;">    [Bool]</span><span style="color: #800080;">$SupportOrdering</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">$True</span><span style="color: #000000;">,                          </span><span style="color: #008000;">#</span><span style="color: #008000;"> optional    default to true</span><span style="color: #008000;">
</span><span style="color: #000000;">    [String]</span><span style="color: #800080;">$UserMetadata</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">$Null</span><span style="color: #000000;">,                           </span><span style="color: #008000;">#</span><span style="color: #008000;"> optional    default to null</span><span style="color: #008000;">
</span><span style="color: #000000;">    [Parameter(Mandatory </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">$true</span><span style="color: #000000;">)]
    [ValidatePattern(</span><span style="color: #800000;">"</span><span style="color: #800000;">^[a-z0-9]*$</span><span style="color: #800000;">"</span><span style="color: #000000;">)]
    [String]</span><span style="color: #800080;">$Namespace</span><span style="color: #000000;">,                                      </span><span style="color: #008000;">#</span><span style="color: #008000;"> required    needs to be alphanumeric</span><span style="color: #008000;">
</span><span style="color: #000000;">    [Bool]</span><span style="color: #800080;">$CreateACSNamespace</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">$False</span><span style="color: #000000;">,                      </span><span style="color: #008000;">#</span><span style="color: #008000;"> optional    default to $false</span><span style="color: #008000;">
</span><span style="color: #000000;">    [String]</span><span style="color: #800080;">$Location</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">West Europe</span><span style="color: #800000;">"</span><span style="color: #000000;">                        </span><span style="color: #008000;">#</span><span style="color: #008000;"> optional    default to "West Europe"</span><span style="color: #008000;">
</span><span style="color: #000000;">    )

</span><span style="color: #008000;">#</span><span style="color: #008000;"> Set the output level to verbose and make the script stop on error</span><span style="color: #008000;">
</span><span style="color: #800080;">$VerbosePreference</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">Continue</span><span style="color: #800000;">"</span><span style="color: #000000;">
</span><span style="color: #800080;">$ErrorActionPreference</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">Stop</span><span style="color: #800000;">"</span><span style="color: #000000;">

</span><span style="color: #008000;">#</span><span style="color: #008000;"> WARNING: Make sure to reference the latest version of the \Microsoft.ServiceBus.dll</span><span style="color: #008000;">
</span><span style="color: #000000;">Write</span><span style="color: #000000;">-</span><span style="color: #000000;">Output </span><span style="color: #800000;">"</span><span style="color: #800000;">Adding the [Microsoft.ServiceBus.dll] assembly to the script...</span><span style="color: #800000;">"</span><span style="color: #000000;">
Add</span><span style="color: #000000;">-</span><span style="color: #000000;">Type </span><span style="color: #000000;">-</span><span style="color: #000000;">Path </span><span style="color: #800000;">"</span><span style="color: #800000;">C:\Projects\Azure\ServiceBusExplorerNew\ServiceBusExplorer2.4Git\bin\Debug\Microsoft.ServiceBus.dll</span><span style="color: #800000;">"</span><span style="color: #000000;">
Write</span><span style="color: #000000;">-</span><span style="color: #000000;">Output </span><span style="color: #800000;">"</span><span style="color: #800000;">The [Microsoft.ServiceBus.dll] assembly has been successfully added to the script.</span><span style="color: #800000;">"</span><span style="color: #000000;">

</span><span style="color: #008000;">#</span><span style="color: #008000;"> Mark the start time of the script execution</span><span style="color: #008000;">
</span><span style="color: #800080;">$startTime</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> Get</span><span style="color: #000000;">-</span><span style="color: #000000;">Date

</span><span style="color: #008000;">#</span><span style="color: #008000;"> Create Azure Service Bus namespace</span><span style="color: #008000;">
</span><span style="color: #800080;">$CurrentNamespace</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> Get</span><span style="color: #000000;">-</span><span style="color: #000000;">AzureSBNamespace </span><span style="color: #000000;">-</span><span style="color: #000000;">Name </span><span style="color: #800080;">$Namespace</span><span style="color: #000000;">


</span><span style="color: #008000;">#</span><span style="color: #008000;"> Check if the namespace already exists or needs to be created</span><span style="color: #008000;">
</span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (</span><span style="color: #800080;">$CurrentNamespace</span><span style="color: #000000;">)
{
    Write</span><span style="color: #000000;">-</span><span style="color: #000000;">Output </span><span style="color: #800000;">"</span><span style="color: #800000;">The namespace [$Namespace] already exists in the [$($CurrentNamespace.Region)] region.</span><span style="color: #800000;">"</span><span style="color: #000000;"> 
}
</span><span style="color: #0000FF;">else</span><span style="color: #000000;">
{
    Write</span><span style="color: #000000;">-</span><span style="color: #000000;">Host </span><span style="color: #800000;">"</span><span style="color: #800000;">The [$Namespace] namespace does not exist.</span><span style="color: #800000;">"</span><span style="color: #000000;">
    Write</span><span style="color: #000000;">-</span><span style="color: #000000;">Output </span><span style="color: #800000;">"</span><span style="color: #800000;">Creating the [$Namespace] namespace in the [$Location] region...</span><span style="color: #800000;">"</span><span style="color: #000000;">
    New</span><span style="color: #000000;">-</span><span style="color: #000000;">AzureSBNamespace </span><span style="color: #000000;">-</span><span style="color: #000000;">Name </span><span style="color: #800080;">$Namespace</span><span style="color: #000000;"> </span><span style="color: #000000;">-</span><span style="color: #000000;">Location </span><span style="color: #800080;">$Location</span><span style="color: #000000;"> </span><span style="color: #000000;">-</span><span style="color: #000000;">CreateACSNamespace </span><span style="color: #800080;">$CreateACSNamespace</span><span style="color: #000000;"> </span><span style="color: #000000;">-</span><span style="color: #000000;">NamespaceType Messaging
    </span><span style="color: #800080;">$CurrentNamespace</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> Get</span><span style="color: #000000;">-</span><span style="color: #000000;">AzureSBNamespace </span><span style="color: #000000;">-</span><span style="color: #000000;">Name </span><span style="color: #800080;">$Namespace</span><span style="color: #000000;">
    Write</span><span style="color: #000000;">-</span><span style="color: #000000;">Host </span><span style="color: #800000;">"</span><span style="color: #800000;">The [$Namespace] namespace in the [$Location] region has been successfully created.</span><span style="color: #800000;">"</span><span style="color: #000000;">
}

</span><span style="color: #008000;">#</span><span style="color: #008000;"> Create the NamespaceManager object to create the queue</span><span style="color: #008000;">
</span><span style="color: #000000;">Write</span><span style="color: #000000;">-</span><span style="color: #000000;">Host </span><span style="color: #800000;">"</span><span style="color: #800000;">Creating a NamespaceManager object for the [$Namespace] namespace...</span><span style="color: #800000;">"</span><span style="color: #000000;">
</span><span style="color: #800080;">$NamespaceManager</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> [Microsoft.ServiceBus.NamespaceManager]</span><span style="color: #000000;">::</span><span style="color: #000000;">CreateFromConnectionString(</span><span style="color: #800080;">$CurrentNamespace</span><span style="color: #000000;">.ConnectionString);
Write</span><span style="color: #000000;">-</span><span style="color: #000000;">Host </span><span style="color: #800000;">"</span><span style="color: #800000;">NamespaceManager object for the [$Namespace] namespace has been successfully created.</span><span style="color: #800000;">"</span><span style="color: #000000;">

</span><span style="color: #008000;">#</span><span style="color: #008000;"> Check if the queue already exists</span><span style="color: #008000;">
</span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (</span><span style="color: #800080;">$NamespaceManager</span><span style="color: #000000;">.QueueExists(</span><span style="color: #800080;">$Path</span><span style="color: #000000;">))
{
    Write</span><span style="color: #000000;">-</span><span style="color: #000000;">Output </span><span style="color: #800000;">"</span><span style="color: #800000;">The [$Path] queue already exists in the [$Namespace] namespace.</span><span style="color: #800000;">"</span><span style="color: #000000;"> 
}
</span><span style="color: #0000FF;">else</span><span style="color: #000000;">
{
    Write</span><span style="color: #000000;">-</span><span style="color: #000000;">Output </span><span style="color: #800000;">"</span><span style="color: #800000;">Creating the [$Path] queue in the [$Namespace] namespace...</span><span style="color: #800000;">"</span><span style="color: #000000;">
    </span><span style="color: #800080;">$QueueDescription</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> New</span><span style="color: #000000;">-</span><span style="color: #000000;">Object </span><span style="color: #000000;">-</span><span style="color: #000000;">TypeName Microsoft.ServiceBus.Messaging.QueueDescription </span><span style="color: #000000;">-</span><span style="color: #000000;">ArgumentList </span><span style="color: #800080;">$Path</span><span style="color: #000000;">
    </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (</span><span style="color: #800080;">$AutoDeleteOnIdle</span><span style="color: #000000;"> </span><span style="color: #008080;">-ge</span><span style="color: #000000;"> </span><span style="color: #000000;">5</span><span style="color: #000000;">)
    {
        </span><span style="color: #800080;">$QueueDescription</span><span style="color: #000000;">.AutoDeleteOnIdle </span><span style="color: #000000;">=</span><span style="color: #000000;"> [System.TimeSpan]</span><span style="color: #000000;">::</span><span style="color: #000000;">FromMinutes(</span><span style="color: #800080;">$AutoDeleteOnIdle</span><span style="color: #000000;">)
    }
    </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (</span><span style="color: #800080;">$DefaultMessageTimeToLive</span><span style="color: #000000;"> </span><span style="color: #008080;">-gt</span><span style="color: #000000;"> </span><span style="color: #000000;">0</span><span style="color: #000000;">)
    {
        </span><span style="color: #800080;">$QueueDescription</span><span style="color: #000000;">.DefaultMessageTimeToLive </span><span style="color: #000000;">=</span><span style="color: #000000;"> [System.TimeSpan]</span><span style="color: #000000;">::</span><span style="color: #000000;">FromMinutes(</span><span style="color: #800080;">$DefaultMessageTimeToLive</span><span style="color: #000000;">)
    }
    </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (</span><span style="color: #800080;">$DuplicateDetectionHistoryTimeWindow</span><span style="color: #000000;"> </span><span style="color: #008080;">-gt</span><span style="color: #000000;"> </span><span style="color: #000000;">0</span><span style="color: #000000;">)
    {
        </span><span style="color: #800080;">$QueueDescription</span><span style="color: #000000;">.DuplicateDetectionHistoryTimeWindow </span><span style="color: #000000;">=</span><span style="color: #000000;"> [System.TimeSpan]</span><span style="color: #000000;">::</span><span style="color: #000000;">FromMinutes(</span><span style="color: #800080;">$DuplicateDetectionHistoryTimeWindow</span><span style="color: #000000;">)
    }
    </span><span style="color: #800080;">$QueueDescription</span><span style="color: #000000;">.EnableBatchedOperations </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">$EnableBatchedOperations</span><span style="color: #000000;">
    </span><span style="color: #800080;">$QueueDescription</span><span style="color: #000000;">.EnableDeadLetteringOnMessageExpiration </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">$EnableDeadLetteringOnMessageExpiration</span><span style="color: #000000;">
    </span><span style="color: #800080;">$QueueDescription</span><span style="color: #000000;">.EnableExpress </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">$EnableExpress</span><span style="color: #000000;">
    </span><span style="color: #800080;">$QueueDescription</span><span style="color: #000000;">.EnablePartitioning </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">$EnablePartitioning</span><span style="color: #000000;">
    </span><span style="color: #800080;">$QueueDescription</span><span style="color: #000000;">.ForwardDeadLetteredMessagesTo </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">$ForwardDeadLetteredMessagesTo</span><span style="color: #000000;">
    </span><span style="color: #800080;">$QueueDescription</span><span style="color: #000000;">.ForwardTo </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">$ForwardTo</span><span style="color: #000000;">
    </span><span style="color: #800080;">$QueueDescription</span><span style="color: #000000;">.IsAnonymousAccessible </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">$IsAnonymousAccessible</span><span style="color: #000000;">
    </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (</span><span style="color: #800080;">$LockDuration</span><span style="color: #000000;"> </span><span style="color: #008080;">-gt</span><span style="color: #000000;"> </span><span style="color: #000000;">0</span><span style="color: #000000;">)
    {
        </span><span style="color: #800080;">$QueueDescription</span><span style="color: #000000;">.LockDuration </span><span style="color: #000000;">=</span><span style="color: #000000;"> [System.TimeSpan]</span><span style="color: #000000;">::</span><span style="color: #000000;">FromSeconds(</span><span style="color: #800080;">$LockDuration</span><span style="color: #000000;">)
    }
    </span><span style="color: #800080;">$QueueDescription</span><span style="color: #000000;">.MaxDeliveryCount </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">$MaxDeliveryCount</span><span style="color: #000000;">
    </span><span style="color: #800080;">$QueueDescription</span><span style="color: #000000;">.MaxSizeInMegabytes </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">$MaxSizeInMegabytes</span><span style="color: #000000;">
    </span><span style="color: #800080;">$QueueDescription</span><span style="color: #000000;">.RequiresDuplicateDetection </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">$RequiresDuplicateDetection</span><span style="color: #000000;">
    </span><span style="color: #800080;">$QueueDescription</span><span style="color: #000000;">.RequiresSession </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">$RequiresSession</span><span style="color: #000000;">
    </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (</span><span style="color: #800080;">$EnablePartitioning</span><span style="color: #000000;">)
    {
        </span><span style="color: #800080;">$QueueDescription</span><span style="color: #000000;">.SupportOrdering </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">$False</span><span style="color: #000000;">
    }
    </span><span style="color: #0000FF;">else</span><span style="color: #000000;">
    {
        </span><span style="color: #800080;">$QueueDescription</span><span style="color: #000000;">.SupportOrdering </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">$SupportOrdering</span><span style="color: #000000;">
    }
    </span><span style="color: #800080;">$QueueDescription</span><span style="color: #000000;">.UserMetadata </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">$UserMetadata</span><span style="color: #000000;">
    </span><span style="color: #800080;">$NamespaceManager</span><span style="color: #000000;">.CreateQueue(</span><span style="color: #800080;">$QueueDescription</span><span style="color: #000000;">);
    Write</span><span style="color: #000000;">-</span><span style="color: #000000;">Host </span><span style="color: #800000;">"</span><span style="color: #800000;">The [$Path] queue in the [$Namespace] namespace has been successfully created.</span><span style="color: #800000;">"</span><span style="color: #000000;">
}

</span><span style="color: #008000;">#</span><span style="color: #008000;"> Mark the finish time of the script execution</span><span style="color: #008000;">
</span><span style="color: #800080;">$finishTime</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> Get</span><span style="color: #000000;">-</span><span style="color: #000000;">Date

</span><span style="color: #008000;">#</span><span style="color: #008000;"> Output the time consumed in seconds</span><span style="color: #008000;">
</span><span style="color: #800080;">$TotalTime</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> (</span><span style="color: #800080;">$finishTime</span><span style="color: #000000;"> </span><span style="color: #000000;">-</span><span style="color: #000000;"> </span><span style="color: #800080;">$startTime</span><span style="color: #000000;">).TotalSeconds
Write</span><span style="color: #000000;">-</span><span style="color: #000000;">Output </span><span style="color: #800000;">"</span><span style="color: #800000;">The script completed in $TotalTime seconds.</span><span style="color: #800000;">"</span></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --></div>

<p align="justify">The picture below shows the result of the execution of the script with the following parameters:</p>

<p align="justify"><em>powershell .\CreateQueue.ps1 -Path iotqueue -Namespace iotsolution -DefaultMessageTimeToLive 5 -EnableExpress $True -EnablePartitioning $True -MaxSizeInMegabytes 3072 -UserMetadata 'This queue is used by the IoT solution'&#160;&#160;&#160;&#160; <br /></em></p>

<p align="justify"><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/08/22/metablogapi/1727.CreateQueue_550E0DD3.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-08-22-metablogapi/1727.CreateQueue_5F00_550E0DD3.png"><img title="CreateQueue" style="margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="CreateQueue" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/08/22/metablogapi/8055.CreateQueue_thumb_1D5DE454.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-08-22-metablogapi/8055.CreateQueue_5F00_thumb_5F00_1D5DE454.png" width="804" height="721" /></a></p>

<p align="justify">&#160;</p>

<h2 align="justify">CreateTopic.ps1</h2>

<p align="justify">This script can be used to provision a namespace and topic.</p>

<div id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:6022c3f1-fa19-41c6-a031-652e802e62ff" class="wlWriterEditableSmartContent" style="margin: 0px; padding: 0px; float: none; display: inline;"><pre style="background-color:#FFFFFF;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;overflow: auto;"><span style="color: #000000;">&lt;</span><span style="color: #008000;">#
</span><span style="color: #000000;">    .SYNOPSIS
    This script can be used to provision a namespace and topic.
            
    .DESCRIPTION
    This script can be used to provision a namespace and a topic. 
    
    .PARAMETER  Path
    Specifies the full path of the topic.

    .PARAMETER  AutoDeleteOnIdle
    Specifies after how many minutes the topic is automatically deleted. The minimum duration is </span><span style="color: #000000;">5</span><span style="color: #000000;"> minutes.

    .PARAMETER  DefaultMessageTimeToLive
    Specifies </span><span style="color: #0000FF;">default</span><span style="color: #000000;"> message time to live value </span><span style="color: #0000FF;">in</span><span style="color: #000000;"> minutes. This is the duration after which the message expires, 
    starting from when the message is sent to Service Bus. This is the </span><span style="color: #0000FF;">default</span><span style="color: #000000;"> value used when TimeToLive is not set on a message itself.
    Messages older than their TimeToLive value will expire and no longer be retained </span><span style="color: #0000FF;">in</span><span style="color: #000000;"> the message store. 
    Subscribers will be unable to receive expired messages.A message can have a lower TimeToLive value than that specified here, 
    but by </span><span style="color: #0000FF;">default</span><span style="color: #000000;"> TimeToLive is set to MaxValue. Therefore, this property becomes the </span><span style="color: #0000FF;">default</span><span style="color: #000000;"> time to live value applied to messages.
    
    .PARAMETER  DuplicateDetectionHistoryTimeWindow
    Specifies the duration of the duplicate detection history </span><span style="color: #0000FF;">in</span><span style="color: #000000;"> minutes. The </span><span style="color: #0000FF;">default</span><span style="color: #000000;"> value is </span><span style="color: #000000;">10</span><span style="color: #000000;"> minutes.
    
    .PARAMETER  EnableBatchedOperations
    Specifies whether server</span><span style="color: #000000;">-</span><span style="color: #000000;">side batched operations are enabled.
    
    .PARAMETER  EnableExpress
    Specifies whether to enable the topic to be partitioned across multiple message brokers. 
    An express topic holds a message </span><span style="color: #0000FF;">in</span><span style="color: #000000;"> memory temporarily before writing it to persistent storage.

    .PARAMETER  EnableFilteringMessagesBeforePublishing
    Specifies whether messages should be filtered before publishing.
    
    .PARAMETER  EnablePartitioning
    Specifies whether the topic to be partitioned across multiple message brokers is enabled. 
    
    .PARAMETER  IsAnonymousAccessible
    Specifies whether the message is anonymous accessible.
    
    .PARAMETER  MaxSizeInMegabytes
    Specifies the maximum size of the topic </span><span style="color: #0000FF;">in</span><span style="color: #000000;"> megabytes, which is the size of memory allocated </span><span style="color: #0000FF;">for</span><span style="color: #000000;"> the topic.
    
    .PARAMETER  RequiresDuplicateDetection
    Specifies whether the topic requires duplicate detection.
    
    .PARAMETER  SupportOrdering
    Specifies whether the topic supports ordering.
    
    .PARAMETER  UserMetadata
    Specifies the user metadata.

    .PARAMETER  Namespace
    Specifies the name of the Service Bus namespace.

    .PARAMETER  CreateACSNamespace
    Specifies whether  to create an ACS namespace associated to the Service Bus namespace.

    .PARAMETER  Location
    Specifies the location to create the namespace </span><span style="color: #0000FF;">in</span><span style="color: #000000;">. The </span><span style="color: #0000FF;">default</span><span style="color: #000000;"> value is </span><span style="color: #800000;">"</span><span style="color: #800000;">West Europe</span><span style="color: #800000;">"</span><span style="color: #000000;">. 

    Valid values:
    </span><span style="color: #000000;">--</span><span style="color: #000000;"> East Asia
    </span><span style="color: #000000;">--</span><span style="color: #000000;"> East US
    </span><span style="color: #000000;">--</span><span style="color: #000000;"> Central US
    </span><span style="color: #000000;">--</span><span style="color: #000000;"> North Central US
    </span><span style="color: #000000;">--</span><span style="color: #000000;"> North Europe
    </span><span style="color: #000000;">--</span><span style="color: #000000;"> West Europe
    </span><span style="color: #000000;">--</span><span style="color: #000000;"> West US
    
    .NOTES  
    Author     : Paolo Salvatori
    Twitter    : </span><span style="color: #000000;">@</span><span style="color: #000000;">babosbird
    Blog       : http:</span><span style="color: #000000;">//</span><span style="color: #000000;">blogs.msdn.com</span><span style="color: #000000;">/</span><span style="color: #000000;">b</span><span style="color: #000000;">/</span><span style="color: #000000;">paolos</span><span style="color: #000000;">/</span><span style="color: #000000;">
</span><span style="color: #008000;">#</span><span style="color: #008000;">&gt;</span><span style="color: #008000;">
</span><span style="color: #000000;">
[CmdletBinding(PositionalBinding</span><span style="color: #000000;">=</span><span style="color: #0000FF;">$True</span><span style="color: #000000;">)]
</span><span style="color: #0000FF;">Param</span><span style="color: #000000;">(
    [Parameter(Mandatory </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">$true</span><span style="color: #000000;">)]
    [ValidatePattern(</span><span style="color: #800000;">"</span><span style="color: #800000;">^[a-z0-9]*$</span><span style="color: #800000;">"</span><span style="color: #000000;">)]
    [String]</span><span style="color: #800080;">$Path</span><span style="color: #000000;">,                                           </span><span style="color: #008000;">#</span><span style="color: #008000;"> required    needs to be alphanumeric    </span><span style="color: #008000;">
</span><span style="color: #000000;">    [Int]</span><span style="color: #800080;">$AutoDeleteOnIdle</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">,                             </span><span style="color: #008000;">#</span><span style="color: #008000;"> optional    default to -1</span><span style="color: #008000;">
</span><span style="color: #000000;">    [Int]</span><span style="color: #800080;">$DefaultMessageTimeToLive</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">,                     </span><span style="color: #008000;">#</span><span style="color: #008000;"> optional    default to -1</span><span style="color: #008000;">
</span><span style="color: #000000;">    [Int]</span><span style="color: #800080;">$DuplicateDetectionHistoryTimeWindow</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">10</span><span style="color: #000000;">,          </span><span style="color: #008000;">#</span><span style="color: #008000;"> optional    default to 10</span><span style="color: #008000;">
</span><span style="color: #000000;">    [Bool]</span><span style="color: #800080;">$EnableBatchedOperations</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">$True</span><span style="color: #000000;">,                  </span><span style="color: #008000;">#</span><span style="color: #008000;"> optional    default to true</span><span style="color: #008000;">
</span><span style="color: #000000;">    [Bool]</span><span style="color: #800080;">$EnableFilteringMessagesBeforePublishing</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">$False</span><span style="color: #000000;">, </span><span style="color: #008000;">#</span><span style="color: #008000;"> optional    default to false</span><span style="color: #008000;">
</span><span style="color: #000000;">    [Bool]</span><span style="color: #800080;">$EnableExpress</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">$False</span><span style="color: #000000;">,                           </span><span style="color: #008000;">#</span><span style="color: #008000;"> optional    default to false</span><span style="color: #008000;">
</span><span style="color: #000000;">    [Bool]</span><span style="color: #800080;">$EnablePartitioning</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">$False</span><span style="color: #000000;">,                      </span><span style="color: #008000;">#</span><span style="color: #008000;"> optional    default to false</span><span style="color: #008000;">
</span><span style="color: #000000;">    [Bool]</span><span style="color: #800080;">$IsAnonymousAccessible</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">$False</span><span style="color: #000000;">,                   </span><span style="color: #008000;">#</span><span style="color: #008000;"> optional    default to false</span><span style="color: #008000;">
</span><span style="color: #000000;">    [Int]</span><span style="color: #800080;">$MaxSizeInMegabytes</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">1024</span><span style="color: #000000;">,                         </span><span style="color: #008000;">#</span><span style="color: #008000;"> optional    default to 1024</span><span style="color: #008000;">
</span><span style="color: #000000;">    [Bool]</span><span style="color: #800080;">$RequiresDuplicateDetection</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">$False</span><span style="color: #000000;">,              </span><span style="color: #008000;">#</span><span style="color: #008000;"> optional    default to false</span><span style="color: #008000;">
</span><span style="color: #000000;">    [Bool]</span><span style="color: #800080;">$SupportOrdering</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">$True</span><span style="color: #000000;">,                          </span><span style="color: #008000;">#</span><span style="color: #008000;"> optional    default to true</span><span style="color: #008000;">
</span><span style="color: #000000;">    [String]</span><span style="color: #800080;">$UserMetadata</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">$Null</span><span style="color: #000000;">,                           </span><span style="color: #008000;">#</span><span style="color: #008000;"> optional    default to null</span><span style="color: #008000;">
</span><span style="color: #000000;">    [Parameter(Mandatory </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">$true</span><span style="color: #000000;">)]
    [ValidatePattern(</span><span style="color: #800000;">"</span><span style="color: #800000;">^[a-z0-9]*$</span><span style="color: #800000;">"</span><span style="color: #000000;">)]
    [String]</span><span style="color: #800080;">$Namespace</span><span style="color: #000000;">,                                      </span><span style="color: #008000;">#</span><span style="color: #008000;"> required    needs to be alphanumeric</span><span style="color: #008000;">
</span><span style="color: #000000;">    [Bool]</span><span style="color: #800080;">$CreateACSNamespace</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">$False</span><span style="color: #000000;">,                      </span><span style="color: #008000;">#</span><span style="color: #008000;"> optional    default to $false</span><span style="color: #008000;">
</span><span style="color: #000000;">    [String]</span><span style="color: #800080;">$Location</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">West Europe</span><span style="color: #800000;">"</span><span style="color: #000000;">                        </span><span style="color: #008000;">#</span><span style="color: #008000;"> optional    default to "West Europe"</span><span style="color: #008000;">
</span><span style="color: #000000;">    )

</span><span style="color: #008000;">#</span><span style="color: #008000;"> Set the output level to verbose and make the script stop on error</span><span style="color: #008000;">
</span><span style="color: #800080;">$VerbosePreference</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">Continue</span><span style="color: #800000;">"</span><span style="color: #000000;">
</span><span style="color: #800080;">$ErrorActionPreference</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">Stop</span><span style="color: #800000;">"</span><span style="color: #000000;">

</span><span style="color: #008000;">#</span><span style="color: #008000;"> WARNING: Make sure to reference the latest version of the \Microsoft.ServiceBus.dll</span><span style="color: #008000;">
</span><span style="color: #000000;">Write</span><span style="color: #000000;">-</span><span style="color: #000000;">Output </span><span style="color: #800000;">"</span><span style="color: #800000;">Adding the [Microsoft.ServiceBus.dll] assembly to the script...</span><span style="color: #800000;">"</span><span style="color: #000000;">
Add</span><span style="color: #000000;">-</span><span style="color: #000000;">Type </span><span style="color: #000000;">-</span><span style="color: #000000;">Path </span><span style="color: #800000;">"</span><span style="color: #800000;">C:\Projects\Azure\ServiceBusExplorerNew\ServiceBusExplorer2.4Git\bin\Debug\Microsoft.ServiceBus.dll</span><span style="color: #800000;">"</span><span style="color: #000000;">
Write</span><span style="color: #000000;">-</span><span style="color: #000000;">Output </span><span style="color: #800000;">"</span><span style="color: #800000;">The [Microsoft.ServiceBus.dll] assembly has been successfully added to the script.</span><span style="color: #800000;">"</span><span style="color: #000000;">

</span><span style="color: #008000;">#</span><span style="color: #008000;"> Mark the start time of the script execution</span><span style="color: #008000;">
</span><span style="color: #800080;">$startTime</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> Get</span><span style="color: #000000;">-</span><span style="color: #000000;">Date

</span><span style="color: #008000;">#</span><span style="color: #008000;"> Create Azure Service Bus namespace</span><span style="color: #008000;">
</span><span style="color: #800080;">$CurrentNamespace</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> Get</span><span style="color: #000000;">-</span><span style="color: #000000;">AzureSBNamespace </span><span style="color: #000000;">-</span><span style="color: #000000;">Name </span><span style="color: #800080;">$Namespace</span><span style="color: #000000;">


</span><span style="color: #008000;">#</span><span style="color: #008000;"> Check if the namespace already exists or needs to be created</span><span style="color: #008000;">
</span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (</span><span style="color: #800080;">$CurrentNamespace</span><span style="color: #000000;">)
{
    Write</span><span style="color: #000000;">-</span><span style="color: #000000;">Output </span><span style="color: #800000;">"</span><span style="color: #800000;">The namespace [$Namespace] already exists in the [$($CurrentNamespace.Region)] region.</span><span style="color: #800000;">"</span><span style="color: #000000;"> 
}
</span><span style="color: #0000FF;">else</span><span style="color: #000000;">
{
    Write</span><span style="color: #000000;">-</span><span style="color: #000000;">Host </span><span style="color: #800000;">"</span><span style="color: #800000;">The [$Namespace] namespace does not exist.</span><span style="color: #800000;">"</span><span style="color: #000000;">
    Write</span><span style="color: #000000;">-</span><span style="color: #000000;">Output </span><span style="color: #800000;">"</span><span style="color: #800000;">Creating the [$Namespace] namespace in the [$Location] region...</span><span style="color: #800000;">"</span><span style="color: #000000;">
    New</span><span style="color: #000000;">-</span><span style="color: #000000;">AzureSBNamespace </span><span style="color: #000000;">-</span><span style="color: #000000;">Name </span><span style="color: #800080;">$Namespace</span><span style="color: #000000;"> </span><span style="color: #000000;">-</span><span style="color: #000000;">Location </span><span style="color: #800080;">$Location</span><span style="color: #000000;"> </span><span style="color: #000000;">-</span><span style="color: #000000;">CreateACSNamespace </span><span style="color: #800080;">$CreateACSNamespace</span><span style="color: #000000;"> </span><span style="color: #000000;">-</span><span style="color: #000000;">NamespaceType Messaging
    </span><span style="color: #800080;">$CurrentNamespace</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> Get</span><span style="color: #000000;">-</span><span style="color: #000000;">AzureSBNamespace </span><span style="color: #000000;">-</span><span style="color: #000000;">Name </span><span style="color: #800080;">$Namespace</span><span style="color: #000000;">
    Write</span><span style="color: #000000;">-</span><span style="color: #000000;">Host </span><span style="color: #800000;">"</span><span style="color: #800000;">The [$Namespace] namespace in the [$Location] region has been successfully created.</span><span style="color: #800000;">"</span><span style="color: #000000;">
}

</span><span style="color: #008000;">#</span><span style="color: #008000;"> Create the NamespaceManager object to create the topic</span><span style="color: #008000;">
</span><span style="color: #000000;">Write</span><span style="color: #000000;">-</span><span style="color: #000000;">Host </span><span style="color: #800000;">"</span><span style="color: #800000;">Creating a NamespaceManager object for the [$Namespace] namespace...</span><span style="color: #800000;">"</span><span style="color: #000000;">
</span><span style="color: #800080;">$NamespaceManager</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> [Microsoft.ServiceBus.NamespaceManager]</span><span style="color: #000000;">::</span><span style="color: #000000;">CreateFromConnectionString(</span><span style="color: #800080;">$CurrentNamespace</span><span style="color: #000000;">.ConnectionString);
Write</span><span style="color: #000000;">-</span><span style="color: #000000;">Host </span><span style="color: #800000;">"</span><span style="color: #800000;">NamespaceManager object for the [$Namespace] namespace has been successfully created.</span><span style="color: #800000;">"</span><span style="color: #000000;">

</span><span style="color: #008000;">#</span><span style="color: #008000;"> Check if the topic already exists</span><span style="color: #008000;">
</span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (</span><span style="color: #800080;">$NamespaceManager</span><span style="color: #000000;">.TopicExists(</span><span style="color: #800080;">$Path</span><span style="color: #000000;">))
{
    Write</span><span style="color: #000000;">-</span><span style="color: #000000;">Output </span><span style="color: #800000;">"</span><span style="color: #800000;">The [$Path] topic already exists in the [$Namespace] namespace.</span><span style="color: #800000;">"</span><span style="color: #000000;"> 
}
</span><span style="color: #0000FF;">else</span><span style="color: #000000;">
{
    Write</span><span style="color: #000000;">-</span><span style="color: #000000;">Output </span><span style="color: #800000;">"</span><span style="color: #800000;">Creating the [$Path] topic in the [$Namespace] namespace...</span><span style="color: #800000;">"</span><span style="color: #000000;">
    </span><span style="color: #800080;">$TopicDescription</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> New</span><span style="color: #000000;">-</span><span style="color: #000000;">Object </span><span style="color: #000000;">-</span><span style="color: #000000;">TypeName Microsoft.ServiceBus.Messaging.TopicDescription </span><span style="color: #000000;">-</span><span style="color: #000000;">ArgumentList </span><span style="color: #800080;">$Path</span><span style="color: #000000;">
    </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (</span><span style="color: #800080;">$AutoDeleteOnIdle</span><span style="color: #000000;"> </span><span style="color: #008080;">-ge</span><span style="color: #000000;"> </span><span style="color: #000000;">5</span><span style="color: #000000;">)
    {
        </span><span style="color: #800080;">$TopicDescription</span><span style="color: #000000;">.AutoDeleteOnIdle </span><span style="color: #000000;">=</span><span style="color: #000000;"> [System.TimeSpan]</span><span style="color: #000000;">::</span><span style="color: #000000;">FromMinutes(</span><span style="color: #800080;">$AutoDeleteOnIdle</span><span style="color: #000000;">)
    }
    </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (</span><span style="color: #800080;">$DefaultMessageTimeToLive</span><span style="color: #000000;"> </span><span style="color: #008080;">-gt</span><span style="color: #000000;"> </span><span style="color: #000000;">0</span><span style="color: #000000;">)
    {
        </span><span style="color: #800080;">$TopicDescription</span><span style="color: #000000;">.DefaultMessageTimeToLive </span><span style="color: #000000;">=</span><span style="color: #000000;"> [System.TimeSpan]</span><span style="color: #000000;">::</span><span style="color: #000000;">FromMinutes(</span><span style="color: #800080;">$DefaultMessageTimeToLive</span><span style="color: #000000;">)
    }
    </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (</span><span style="color: #800080;">$DuplicateDetectionHistoryTimeWindow</span><span style="color: #000000;"> </span><span style="color: #008080;">-gt</span><span style="color: #000000;"> </span><span style="color: #000000;">0</span><span style="color: #000000;">)
    {
        </span><span style="color: #800080;">$TopicDescription</span><span style="color: #000000;">.DuplicateDetectionHistoryTimeWindow </span><span style="color: #000000;">=</span><span style="color: #000000;"> [System.TimeSpan]</span><span style="color: #000000;">::</span><span style="color: #000000;">FromMinutes(</span><span style="color: #800080;">$DuplicateDetectionHistoryTimeWindow</span><span style="color: #000000;">)
    }
    </span><span style="color: #800080;">$TopicDescription</span><span style="color: #000000;">.EnableBatchedOperations </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">$EnableBatchedOperations</span><span style="color: #000000;">
    </span><span style="color: #800080;">$TopicDescription</span><span style="color: #000000;">.EnableExpress </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">$EnableExpress</span><span style="color: #000000;">
    </span><span style="color: #800080;">$TopicDescription</span><span style="color: #000000;">.EnableFilteringMessagesBeforePublishing </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">$EnableFilteringMessagesBeforePublishing</span><span style="color: #000000;">
    </span><span style="color: #800080;">$TopicDescription</span><span style="color: #000000;">.EnablePartitioning </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">$EnablePartitioning</span><span style="color: #000000;">
    </span><span style="color: #800080;">$TopicDescription</span><span style="color: #000000;">.IsAnonymousAccessible </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">$IsAnonymousAccessible</span><span style="color: #000000;">
    </span><span style="color: #800080;">$TopicDescription</span><span style="color: #000000;">.MaxSizeInMegabytes </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">$MaxSizeInMegabytes</span><span style="color: #000000;">
    </span><span style="color: #800080;">$TopicDescription</span><span style="color: #000000;">.RequiresDuplicateDetection </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">$RequiresDuplicateDetection</span><span style="color: #000000;">
    </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (</span><span style="color: #800080;">$EnablePartitioning</span><span style="color: #000000;">)
    {
        </span><span style="color: #800080;">$TopicDescription</span><span style="color: #000000;">.SupportOrdering </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">$False</span><span style="color: #000000;">
    }
    </span><span style="color: #0000FF;">else</span><span style="color: #000000;">
    {
        </span><span style="color: #800080;">$TopicDescription</span><span style="color: #000000;">.SupportOrdering </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">$SupportOrdering</span><span style="color: #000000;">
    }
    </span><span style="color: #800080;">$TopicDescription</span><span style="color: #000000;">.UserMetadata </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">$UserMetadata</span><span style="color: #000000;">
    </span><span style="color: #800080;">$NamespaceManager</span><span style="color: #000000;">.CreateTopic(</span><span style="color: #800080;">$TopicDescription</span><span style="color: #000000;">);
    Write</span><span style="color: #000000;">-</span><span style="color: #000000;">Host </span><span style="color: #800000;">"</span><span style="color: #800000;">The [$Path] topic in the [$Namespace] namespace has been successfully created.</span><span style="color: #800000;">"</span><span style="color: #000000;">
}

</span><span style="color: #008000;">#</span><span style="color: #008000;"> Mark the finish time of the script execution</span><span style="color: #008000;">
</span><span style="color: #800080;">$finishTime</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> Get</span><span style="color: #000000;">-</span><span style="color: #000000;">Date

</span><span style="color: #008000;">#</span><span style="color: #008000;"> Output the time consumed in seconds</span><span style="color: #008000;">
</span><span style="color: #800080;">$TotalTime</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> (</span><span style="color: #800080;">$finishTime</span><span style="color: #000000;"> </span><span style="color: #000000;">-</span><span style="color: #000000;"> </span><span style="color: #800080;">$startTime</span><span style="color: #000000;">).TotalSeconds
Write</span><span style="color: #000000;">-</span><span style="color: #000000;">Output </span><span style="color: #800000;">"</span><span style="color: #800000;">The script completed in $TotalTime seconds.</span><span style="color: #800000;">"</span></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --></div>

<p>The picture below shows the result of the execution of the script with the following parameters:</p>

<p><em>powershell .\CreateSubscription.ps1 -TopicPath stocks -Name ORCL -Namespace stockmarket -DefaultMessageTimeToLive 1 -SqlFilter 'StockTicker=''ORCL''' -SqlRuleAction 'SET sys.Label=''Stocks''; SET Priority=''Medium''' -UserMetadata 'This subscription is used to process messages for the ORCL stock ticker' 
    <br /></em></p>

<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/08/22/metablogapi/8780.CreateSubscription_1D18ED65.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-08-22-metablogapi/8780.CreateSubscription_5F00_1D18ED65.png"><img title="CreateSubscription" style="margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="CreateSubscription" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/08/22/metablogapi/1212.CreateSubscription_thumb_7ED0C71F.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-08-22-metablogapi/1212.CreateSubscription_5F00_thumb_5F00_7ED0C71F.png" width="804" height="721" /></a></p>

<p>You can download these scripts along with the PowerShell script to create event hubs on MSDN Code Gallery: <a href="https://code.msdn.microsoft.com/windowsazure/Service-Bus-PowerShell-a46b7059">Service Bus PowerShell Scripts</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>How to create a Service Bus Namespace and an Event Hub using a PowerShell script</title>
      <link>https://docs.microsoft.com/archive/blogs/paolos/how-to-create-a-service-bus-namespace-and-an-event-hub-using-a-powershell-script</link>
      <pubDate>Mon, 01 Dec 2014 08:08:57 GMT</pubDate>
      <dc:creator><![CDATA[Paolo Salvatori]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/paolos/2014/12/01/how-to-create-a-service-bus-namespace-and-an-event-hub-using-a-powershell-script/</guid>
      <description><![CDATA[This week I received the same two questions twice from two different customers: how can I create a...]]></description>
      <content:encoded><![CDATA[<p>This week I received the same two questions twice from two different customers: how can I create a Service Bus namespace from a PowerShell script? Moreover, after I created the Service Bus namespace, how can I create an event hub from a PowerShell script? The answer to the first question is easy: to create a new Azure Service Bus namespace you can use the <a href="http://msdn.microsoft.com/en-us/library/azure/dn495165.aspx">New-AzureSBNamespace</a> PowerShell cmdlet. The answer to the second question is also straightforward: to create a new Event Hub you can use the <a href="http://msdn.microsoft.com/en-us/library/microsoft.servicebus.namespacemanager.createeventhub.aspx">CreateEventHub</a> method of the <a href="http://msdn.microsoft.com/en-us/library/microsoft.servicebus.namespacemanager.aspx">NamespaceManager</a> class. The second question should be posed in a different way: how can I use the classes of the <a href="http://www.nuget.org/packages/WindowsAzure.ServiceBus">Microsoft.ServiceBus.dll</a> assembly inside a PowerShell script? The following post shows a PowerShell script that you can use to create a Service Bus namespace, an <a href="http://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.eventhubdescription.aspx">Event Hub</a> and a <a href="http://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.consumergroupdescription.aspx">Consumer Group</a> for the newly created Event Hub.</p>  <div id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:b9a021f1-6905-4643-a7ed-9fc7418626b2" class="wlWriterEditableSmartContent" style="margin: 0px; padding: 0px; float: none; display: inline;"><pre style="background-color:#FFFFFF;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;overflow: auto;"><span style="color: #000000;">&lt;</span><span style="color: #008000;">#
</span><span style="color: #000000;">    .SYNOPSIS
    This script can be used to provision a namespace and an event hub.
            
    .DESCRIPTION
    This script can be used to provision a namespace and an event hub. 
    </span><span style="color: #0000FF;">In</span><span style="color: #000000;"> particular, the script allows to specify the following parameters:
    </span><span style="color: #000000;">--</span><span style="color: #000000;"> Event Hub path
    </span><span style="color: #000000;">--</span><span style="color: #000000;"> Event hub message retention </span><span style="color: #0000FF;">in</span><span style="color: #000000;"> days
    </span><span style="color: #000000;">--</span><span style="color: #000000;"> Event Hub partition count
    </span><span style="color: #000000;">--</span><span style="color: #000000;"> Event Hub user metadata
    </span><span style="color: #000000;">--</span><span style="color: #000000;"> Service Bus Namespace
    </span><span style="color: #000000;">--</span><span style="color: #000000;"> Azure Datacenter location
    
    .PARAMETER  Path
    Specifies the full path of the event hub.

    .PARAMETER  PartitionCount
    Specifies the current number of shards on the event hub.

    .PARAMETER  MessageRetentionInDays
    Specifies the number of days to retain the events </span><span style="color: #0000FF;">for</span><span style="color: #000000;"> this event hub.

    .PARAMETER  UserMetadata
    Specifies the user metadata </span><span style="color: #0000FF;">for</span><span style="color: #000000;"> the event hub.
    
    .PARAMETER  ConsumerGroupName
    Specifies the name of a custom consumer group.

    .PARAMETER  ConsumerGroupUserMetadata
    Specifies the user metadata </span><span style="color: #0000FF;">for</span><span style="color: #000000;"> the custom consumer group.

    .PARAMETER  Namespace
    Specifies the name of the Service Bus namespace.

    .PARAMETER  CreateACSNamespace
    Specifies whether  to create an ACS namespace associated to the Service Bus namespace.

    .PARAMETER  Location
    Specifies the location to create the namespace </span><span style="color: #0000FF;">in</span><span style="color: #000000;">. The </span><span style="color: #0000FF;">default</span><span style="color: #000000;"> value is </span><span style="color: #800000;">"</span><span style="color: #800000;">West Europe</span><span style="color: #800000;">"</span><span style="color: #000000;">. 

    Valid values:
    </span><span style="color: #000000;">--</span><span style="color: #000000;"> East Asia
    </span><span style="color: #000000;">--</span><span style="color: #000000;"> East US
    </span><span style="color: #000000;">--</span><span style="color: #000000;"> North Central US
    </span><span style="color: #000000;">--</span><span style="color: #000000;"> North Europe
    </span><span style="color: #000000;">--</span><span style="color: #000000;"> West Europe
    </span><span style="color: #000000;">--</span><span style="color: #000000;"> West US
    
</span><span style="color: #008000;">#</span><span style="color: #008000;">&gt;</span><span style="color: #008000;">
</span><span style="color: #000000;">
[CmdletBinding(PositionalBinding</span><span style="color: #000000;">=</span><span style="color: #0000FF;">$True</span><span style="color: #000000;">)]
</span><span style="color: #0000FF;">Param</span><span style="color: #000000;">(
    [Parameter(Mandatory </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">$true</span><span style="color: #000000;">)]
    [ValidatePattern(</span><span style="color: #800000;">"</span><span style="color: #800000;">^[a-z0-9]*$</span><span style="color: #800000;">"</span><span style="color: #000000;">)]
    [String]</span><span style="color: #800080;">$Path</span><span style="color: #000000;">,                                  </span><span style="color: #008000;">#</span><span style="color: #008000;"> required    needs to be alphanumeric    </span><span style="color: #008000;">
</span><span style="color: #000000;">    [Int]</span><span style="color: #800080;">$PartitionCount</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">16</span><span style="color: #000000;">,                      </span><span style="color: #008000;">#</span><span style="color: #008000;"> optional    default to 16</span><span style="color: #008000;">
</span><span style="color: #000000;">    [Int]</span><span style="color: #800080;">$MessageRetentionInDays</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">7</span><span style="color: #000000;">,               </span><span style="color: #008000;">#</span><span style="color: #008000;"> optional    default to 7</span><span style="color: #008000;">
</span><span style="color: #000000;">    [String]</span><span style="color: #800080;">$UserMetadata</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">$null</span><span style="color: #000000;">,                  </span><span style="color: #008000;">#</span><span style="color: #008000;"> optional    default to $null</span><span style="color: #008000;">
</span><span style="color: #000000;">    [String]</span><span style="color: #800080;">$ConsumerGroupName</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">MyConsumerGroup</span><span style="color: #800000;">"</span><span style="color: #000000;">, </span><span style="color: #008000;">#</span><span style="color: #008000;"> optional    default to "MyConsumerGroup"</span><span style="color: #008000;">
</span><span style="color: #000000;">    [String]</span><span style="color: #800080;">$ConsumerGroupUserMetadata</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">$null</span><span style="color: #000000;">,     </span><span style="color: #008000;">#</span><span style="color: #008000;"> optional    default to $null</span><span style="color: #008000;">
</span><span style="color: #000000;">    [Parameter(Mandatory </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">$true</span><span style="color: #000000;">)]
    [ValidatePattern(</span><span style="color: #800000;">"</span><span style="color: #800000;">^[a-z0-9]*$</span><span style="color: #800000;">"</span><span style="color: #000000;">)]
    [String]</span><span style="color: #800080;">$Namespace</span><span style="color: #000000;">,                             </span><span style="color: #008000;">#</span><span style="color: #008000;"> required    needs to be alphanumeric</span><span style="color: #008000;">
</span><span style="color: #000000;">    [Bool]</span><span style="color: #800080;">$CreateACSNamespace</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">$False</span><span style="color: #000000;">,             </span><span style="color: #008000;">#</span><span style="color: #008000;"> optional    default to $false</span><span style="color: #008000;">
</span><span style="color: #000000;">    [String]</span><span style="color: #800080;">$Location</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">West Europe</span><span style="color: #800000;">"</span><span style="color: #000000;">               </span><span style="color: #008000;">#</span><span style="color: #008000;"> optional    default to "West Europe"</span><span style="color: #008000;">
</span><span style="color: #000000;">    )

</span><span style="color: #008000;">#</span><span style="color: #008000;"> Set the output level to verbose and make the script stop on error</span><span style="color: #008000;">
</span><span style="color: #800080;">$VerbosePreference</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">Continue</span><span style="color: #800000;">"</span><span style="color: #000000;">
</span><span style="color: #800080;">$ErrorActionPreference</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">Stop</span><span style="color: #800000;">"</span><span style="color: #000000;">

</span><span style="color: #008000;">#</span><span style="color: #008000;"> WARNING: Make sure to reference the latest version of the \Microsoft.ServiceBus.dll</span><span style="color: #008000;">
</span><span style="color: #000000;">Write</span><span style="color: #000000;">-</span><span style="color: #000000;">Output </span><span style="color: #800000;">"</span><span style="color: #800000;">Adding the [Microsoft.ServiceBus.dll] assembly to the script...</span><span style="color: #800000;">"</span><span style="color: #000000;">
Add</span><span style="color: #000000;">-</span><span style="color: #000000;">Type </span><span style="color: #000000;">-</span><span style="color: #000000;">Path </span><span style="color: #800000;">"</span><span style="color: #800000;">C:\Projects\Azure\ServiceBusExplorerNew\ServiceBusExplorer2.4Git\bin\Debug\Microsoft.ServiceBus.dll</span><span style="color: #800000;">"</span><span style="color: #000000;">
Write</span><span style="color: #000000;">-</span><span style="color: #000000;">Output </span><span style="color: #800000;">"</span><span style="color: #800000;">The [Microsoft.ServiceBus.dll] assembly has been successfully added to the script.</span><span style="color: #800000;">"</span><span style="color: #000000;">

</span><span style="color: #008000;">#</span><span style="color: #008000;"> Mark the start time of the script execution</span><span style="color: #008000;">
</span><span style="color: #800080;">$startTime</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> Get</span><span style="color: #000000;">-</span><span style="color: #000000;">Date

</span><span style="color: #008000;">#</span><span style="color: #008000;"> Create Azure Service Bus namespace</span><span style="color: #008000;">
</span><span style="color: #800080;">$CurrentNamespace</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> Get</span><span style="color: #000000;">-</span><span style="color: #000000;">AzureSBNamespace </span><span style="color: #000000;">-</span><span style="color: #000000;">Name </span><span style="color: #800080;">$Namespace</span><span style="color: #000000;">


</span><span style="color: #008000;">#</span><span style="color: #008000;"> Check if the namespace already exists or needs to be created</span><span style="color: #008000;">
</span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (</span><span style="color: #800080;">$CurrentNamespace</span><span style="color: #000000;">)
{
    Write</span><span style="color: #000000;">-</span><span style="color: #000000;">Output </span><span style="color: #800000;">"</span><span style="color: #800000;">The namespace [$Namespace] already exists in the [$($CurrentNamespace.Region)] region.</span><span style="color: #800000;">"</span><span style="color: #000000;"> 
}
</span><span style="color: #0000FF;">else</span><span style="color: #000000;">
{
    Write</span><span style="color: #000000;">-</span><span style="color: #000000;">Host </span><span style="color: #800000;">"</span><span style="color: #800000;">The [$Namespace] namespace does not exist.</span><span style="color: #800000;">"</span><span style="color: #000000;">
    Write</span><span style="color: #000000;">-</span><span style="color: #000000;">Output </span><span style="color: #800000;">"</span><span style="color: #800000;">Creating the [$Namespace] namespace in the [$Location] region...</span><span style="color: #800000;">"</span><span style="color: #000000;">
    New</span><span style="color: #000000;">-</span><span style="color: #000000;">AzureSBNamespace </span><span style="color: #000000;">-</span><span style="color: #000000;">Name </span><span style="color: #800080;">$Namespace</span><span style="color: #000000;"> </span><span style="color: #000000;">-</span><span style="color: #000000;">Location </span><span style="color: #800080;">$Location</span><span style="color: #000000;"> </span><span style="color: #000000;">-</span><span style="color: #000000;">CreateACSNamespace </span><span style="color: #800080;">$CreateACSNamespace</span><span style="color: #000000;"> </span><span style="color: #000000;">-</span><span style="color: #000000;">NamespaceType Messaging
    </span><span style="color: #800080;">$CurrentNamespace</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> Get</span><span style="color: #000000;">-</span><span style="color: #000000;">AzureSBNamespace </span><span style="color: #000000;">-</span><span style="color: #000000;">Name </span><span style="color: #800080;">$Namespace</span><span style="color: #000000;">
    Write</span><span style="color: #000000;">-</span><span style="color: #000000;">Host </span><span style="color: #800000;">"</span><span style="color: #800000;">The [$Namespace] namespace in the [$Location] region has been successfully created.</span><span style="color: #800000;">"</span><span style="color: #000000;">
}

</span><span style="color: #008000;">#</span><span style="color: #008000;"> Create the NamespaceManager object to create the event hub</span><span style="color: #008000;">
</span><span style="color: #000000;">Write</span><span style="color: #000000;">-</span><span style="color: #000000;">Host </span><span style="color: #800000;">"</span><span style="color: #800000;">Creating a NamespaceManager object for the [$Namespace] namespace...</span><span style="color: #800000;">"</span><span style="color: #000000;">
</span><span style="color: #800080;">$NamespaceManager</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> [Microsoft.ServiceBus.NamespaceManager]</span><span style="color: #000000;">::</span><span style="color: #000000;">CreateFromConnectionString(</span><span style="color: #800080;">$CurrentNamespace</span><span style="color: #000000;">.ConnectionString);
Write</span><span style="color: #000000;">-</span><span style="color: #000000;">Host </span><span style="color: #800000;">"</span><span style="color: #800000;">NamespaceManager object for the [$Namespace] namespace has been successfully created.</span><span style="color: #800000;">"</span><span style="color: #000000;">

</span><span style="color: #008000;">#</span><span style="color: #008000;"> Check if the event hub already exists</span><span style="color: #008000;">
</span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (</span><span style="color: #800080;">$NamespaceManager</span><span style="color: #000000;">.EventHubExists(</span><span style="color: #800080;">$Path</span><span style="color: #000000;">))
{
    Write</span><span style="color: #000000;">-</span><span style="color: #000000;">Output </span><span style="color: #800000;">"</span><span style="color: #800000;">The [$Path] event hub already exists in the [$Namespace] namespace.</span><span style="color: #800000;">"</span><span style="color: #000000;"> 
}
</span><span style="color: #0000FF;">else</span><span style="color: #000000;">
{
    Write</span><span style="color: #000000;">-</span><span style="color: #000000;">Output </span><span style="color: #800000;">"</span><span style="color: #800000;">Creating the [$Path] event hub in the [$Namespace] namespace: PartitionCount=[$PartitionCount] MessageRetentionInDays=[$MessageRetentionInDays]...</span><span style="color: #800000;">"</span><span style="color: #000000;">
    </span><span style="color: #800080;">$EventHubDescription</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> New</span><span style="color: #000000;">-</span><span style="color: #000000;">Object </span><span style="color: #000000;">-</span><span style="color: #000000;">TypeName Microsoft.ServiceBus.Messaging.EventHubDescription </span><span style="color: #000000;">-</span><span style="color: #000000;">ArgumentList </span><span style="color: #800080;">$Path</span><span style="color: #000000;">
    </span><span style="color: #800080;">$EventHubDescription</span><span style="color: #000000;">.PartitionCount </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">$PartitionCount</span><span style="color: #000000;">
    </span><span style="color: #800080;">$EventHubDescription</span><span style="color: #000000;">.MessageRetentionInDays </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">$MessageRetentionInDays</span><span style="color: #000000;">
    </span><span style="color: #800080;">$EventHubDescription</span><span style="color: #000000;">.UserMetadata </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">$UserMetadata</span><span style="color: #000000;">
    </span><span style="color: #800080;">$NamespaceManager</span><span style="color: #000000;">.CreateEventHub(</span><span style="color: #800080;">$EventHubDescription</span><span style="color: #000000;">);
    Write</span><span style="color: #000000;">-</span><span style="color: #000000;">Host </span><span style="color: #800000;">"</span><span style="color: #800000;">The [$Path] event hub in the [$Namespace] namespace has been successfully created.</span><span style="color: #800000;">"</span><span style="color: #000000;">
}

</span><span style="color: #008000;">#</span><span style="color: #008000;"> Create the consumer group if not exists</span><span style="color: #008000;">
</span><span style="color: #000000;">Write</span><span style="color: #000000;">-</span><span style="color: #000000;">Output </span><span style="color: #800000;">"</span><span style="color: #800000;">Creating the consumer group [$ConsumerGroupName] for the [$Path] event hub...</span><span style="color: #800000;">"</span><span style="color: #000000;">
</span><span style="color: #800080;">$ConsumerGroupDescription</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> New</span><span style="color: #000000;">-</span><span style="color: #000000;">Object </span><span style="color: #000000;">-</span><span style="color: #000000;">TypeName Microsoft.ServiceBus.Messaging.ConsumerGroupDescription </span><span style="color: #000000;">-</span><span style="color: #000000;">ArgumentList </span><span style="color: #800080;">$Path</span><span style="color: #000000;">, </span><span style="color: #800080;">$ConsumerGroupName</span><span style="color: #000000;">
</span><span style="color: #800080;">$ConsumerGroupDescription</span><span style="color: #000000;">.UserMetadata </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">$ConsumerGroupUserMetadata</span><span style="color: #000000;">
</span><span style="color: #800080;">$NamespaceManager</span><span style="color: #000000;">.CreateConsumerGroupIfNotExists(</span><span style="color: #800080;">$ConsumerGroupDescription</span><span style="color: #000000;">);
Write</span><span style="color: #000000;">-</span><span style="color: #000000;">Host </span><span style="color: #800000;">"</span><span style="color: #800000;">The consumer group [$ConsumerGroupName] for the [$Path] event hub has been successfully created.</span><span style="color: #800000;">"</span><span style="color: #000000;">

</span><span style="color: #008000;">#</span><span style="color: #008000;"> Mark the finish time of the script execution</span><span style="color: #008000;">
</span><span style="color: #800080;">$finishTime</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> Get</span><span style="color: #000000;">-</span><span style="color: #000000;">Date

</span><span style="color: #008000;">#</span><span style="color: #008000;"> Output the time consumed in seconds</span><span style="color: #008000;">
</span><span style="color: #800080;">$TotalTime</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> (</span><span style="color: #800080;">$finishTime</span><span style="color: #000000;"> </span><span style="color: #000000;">-</span><span style="color: #000000;"> </span><span style="color: #800080;">$startTime</span><span style="color: #000000;">).TotalSeconds
Write</span><span style="color: #000000;">-</span><span style="color: #000000;">Output </span><span style="color: #800000;">"</span><span style="color: #800000;">The script completed in $TotalTime seconds.</span><span style="color: #800000;">"</span></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --></div>

<p><strong>Note 1</strong>: as highlighted in the comments, make sure to load the latest version of the <a href="http://www.nuget.org/packages/WindowsAzure.ServiceBus">Microsoft.ServiceBus.dll</a> assembly in the script.</p>

<p><strong>Note 2</strong>: you can follow the same approach to create topics, queues, subscriptions and notification hubs instead of event hubs.</p>

<p>The picture below shows the result of the execution of the script with the following parameters:</p>

<p><em>powershell .\CreateEventHub.ps1 -Path ioteventhub -PartitionCount 32 -MessageRetentionInDays 3 -UserMetadata 'This event hub is used by the devices of the IoT solution' -ConsumerGroupName iotconsumergroup -ConsumerGroupUserMetadata 'This consumer group is used by the IoT solution' -Namespace iotsolution -Location 'West Europe'</em></p>

<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/08/22/metablogapi/7801.CommandPrompt_1EB20F0C.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-08-22-metablogapi/7801.CommandPrompt_5F00_1EB20F0C.png"><img title="CommandPrompt" style="margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="CommandPrompt" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/08/22/metablogapi/1882.CommandPrompt_thumb_29DE2A07.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-08-22-metablogapi/1882.CommandPrompt_5F00_thumb_5F00_29DE2A07.png" width="804" height="634" /></a></p>

<p>I’d like to remark that this kind of scripts should be: </p>

<ul>
  <li>parametric to be reusable</li>

  <li>included in the source control system (Visual Studio Online or GitHub) along with the solution and versioned as the application code</li>

  <li>executed as part of the Continuous Delivery process used to automatically deploy the solution to a QA environment when a new version of the application is built</li>
</ul>

<p>In fact, you probably heard the term DevOps more and more times. The term remarks the need to integrate development and operations tasks to build software solutions efficiently over time. This goal can be achieved using a process in which you develop an application, deploy it, learn from production usage of it, change it in response to what you learn, and repeat the cycle quickly and reliably. 
  <br />To achieve this result, you have to build a development and deployment cycle that is repeatable, reliable, predictable, and has low cycle time. In particular, to create the staging and production environment for an Azure application and to deploy the solution in an automated way and integrate this task in the Continuous integration (CI) and Continuous delivery (CD) processes, you should use parametric PowerShell scripts.&#160;&#160;&#160;&#160; <br /></p>
<strong></strong>

<p><strong>Note</strong>: Continuous integration (CI) means that whenever a developer checks in code to the source repository, a build is automatically triggered. Continuous delivery (CD) takes this one-step further: after a build and automated unit tests are successful, you automatically deploy the application to an environment where you can do more in-depth testing.</p>

<p>You can download the script along with the PowerShell scripts to create queues, topics and Subscription on MSDN Code Gallery: <a title="https://code.msdn.microsoft.com/windowsazure/Service-Bus-PowerShell-a46b7059" href="https://code.msdn.microsoft.com/windowsazure/Service-Bus-PowerShell-a46b7059">Service Bus PowerShell Scripts</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Service Bus Explorer 2.3 and 2.1 improved version now available</title>
      <link>https://docs.microsoft.com/archive/blogs/paolos/service-bus-explorer-2-3-and-2-1-improved-version-now-available</link>
      <pubDate>Wed, 21 May 2014 03:01:49 GMT</pubDate>
      <dc:creator><![CDATA[Paolo Salvatori]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/paolos/2014/05/21/service-bus-explorer-2-3-and-2-1-improved-version-now-available/</guid>
      <description><![CDATA[I just released an improved version of the Service Bus Explorer 2.1 and a new version (2.3) of the...]]></description>
      <content:encoded><![CDATA[<p>I just released an improved version of the <a href="http://code.msdn.microsoft.com/windowsapps/Service-Bus-Explorer-f2abca5a">Service Bus Explorer 2.1 and a new version (2.3)</a> of the tool based on the <a href="http://www.nuget.org/packages/WindowsAzure.ServiceBus/">Microsoft.ServiceBus.dll</a> 2.3.2.0.</p>
<p>The zip file contains:</p>
<ul>
<li>The source code for the Service Bus Explorer 2.3.2.0. This version of the tool uses the <a href="http://www.nuget.org/packages/WindowsAzure.ServiceBus/">Microsoft.ServiceBus.dll</a> 2.3.2.0 that is compatible with the current version of the Windows Azure Service Bus, but not with the Service Bus 1.1, that is, the current version of the on-premises version of the Service Bus.</li>
<li>The Service Bus Explorer 2.1.3.0. This version can be used with the Service Bus 1.1. The Service Bus Explorer 2.1 uses the <a href="http://www.nuget.org/packages/WindowsAzure.ServiceBus/">Microsoft.ServiceBus.dll</a> client library which is compatible with the Service Bus for Windows Server 1.1 RTM version, but not with the 1.1 Beta version or the Service Bus for Windows Server 1.0. For this reason, for those of you that are still using the Service Bus for Windows Server version 1.0, I included the old version (1.8) of the Service Bus Explorer in a zip file called 1.8 which in turn is contained in the zip file of the current version. The old version of the Service Bus Explorer uses the Microsoft.ServiceBus.dll 1.8 which is compatible with the Service Bus for Windows Server. For those of you that are instead using the Service Bus for Windows Server 1.1 Beta, you can download the Service Bus Explorer 2.0 from my <a href="http://sdrv.ms/15GEcgz">SkyDrive</a>.</li>
<li>The Service Bus Explorer 1.8. This version can be used with the Service Bus 1.0</li>
</ul>
<p>This version introduces the following features:</p>
<ul>
<li>Improved support for <strong>AMQP </strong>transport protocol in the <strong>Connect Form</strong>. For example, when using the Service Bus Explorer to connect to an on-premises namespace, if you select AMQP as Transport Type in the Connect Form, the tool automatically changes the value of the TransportType and RuntimePort parameters:
<ul>
<li><strong>NetMessaging</strong>: RuntimePort=9354;TransportType=NetMessaging</li>
<li><strong>AMQP</strong>: RuntimePort=5671;TransportType=Amqp</li>
</ul>
</li>
<li>Added support for the <strong>stsEndpoint </strong>parameter in the connection string for cloud namespaces. This feature was specifically requested by the Service Bus team.</li>
<li>The tool can now use the <strong>AMQP </strong>transport protocol to read messages from queues, subscriptions and deadletter queues.</li>
<li>Added full support to namespace-level <strong>SAS connection strings</strong>, both in the configuration file and <strong>Connect Form</strong>.</li>
<li>Changed Receive label into Receive and Delete in the ReceiveModeForm to make it clear that the receive operation deletes messages from the underlying <strong>queue</strong>, <strong>subscription</strong> or <strong>deadletter queue</strong>.</li>
<li>Fixed a bug when reading messages from the deadletter queue of a queue or subscription.</li>
<li>Fixed a bug in the <strong>SelectEntityForm</strong>: replaced <strong>TreeView.TopNode</strong> with <strong>TreeView.Nodes[0]</strong></li>
<li>Implemented support for the new <a href="http://msdn.microsoft.com/en-us/library/azure/microsoft.servicebus.messaging.queuedescription.forwarddeadletteredmessagesto.aspx">ForwardDeadLetteredMessagesTo</a> property of the <a href="http://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.queuedescription.aspx">QueueDescription</a> and <a href="http://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.subscriptiondescription.aspx">SubscriptionDescription</a> classes.</li>
</ul>
<p><img style="margin-right: auto; margin-left: auto; float: none; display: block;" src="http://i1.code.msdn.s-msft.com/windowsazure/service-bus-explorer-f2abca5a/image/file/114913/1/forwarddeadlettermessages.png" alt="" width="800" height="467" /></p>
<ul>
<li>Implemented batching support in the listener for queues and subscriptions. You can now specify a value for the <a href="http://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.messagereceiver.prefetchcount.aspx">PrefetchCount</a> property used by the <a href="http://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.messagereceiver.aspx">MessageReceiver</a> object used by the listener to prefetch multiple messages from a queue or subscription. This greatly improves the overall performance of the listener. Now you can also specify the value for the <a href="http://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.messagereceiver.mode.aspx">Mode</a> property of the the <a href="http://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.messagereceiver.aspx">MessageReceiver</a> object used by the listener.</li>
</ul>
<p><img style="margin-right: auto; margin-left: auto; float: none; display: block;" src="http://i1.code.msdn.s-msft.com/windowsazure/service-bus-explorer-f2abca5a/image/file/114914/1/listener.png" alt="" width="800" height="582" /></p>
<ul>
<li>Added the possibility to create a listener for <strong>session-aware queues</strong> and <strong>subscriptions </strong>(<a href="http://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.queuedescription.requiressession.aspx">RequiresSession</a> = true). The tool uses the <a href="http://msdn.microsoft.com/en-us/library/dn642578.aspx">RegisterSessionHandlerFactoryAsync</a> method of a <a href="http://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.queueclient.aspx">QueueClient</a> or <a href="http://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.subscriptionclient.aspx">SubscriptionClient</a> object to register an asynchronous Session Handler Factory. For more information, see <a href="http://msdn.microsoft.com/en-us/library/dn632585.aspx">What's New in the Azure SDK 2.3 Release (April 2014)</a>.</li>
</ul>
<p><img style="margin-right: auto; margin-left: auto; float: none; display: block;" src="http://i1.code.msdn.s-msft.com/windowsazure/service-bus-explorer-f2abca5a/image/file/114915/1/listenerrequiressession.png" alt="" width="800" height="582" /></p>
<ul>
<li>Added the possibility to visualize the number of active and deadletter messages directly in the main treeview (see 1 and 2 in the figure below). The first number displays the valut of the <a href="http://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.messagecountdetails.activemessagecount.aspx">MessageCountDetails.ActiveMessageCount</a> property, while the second number displays the value of the <a href="http://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.messagecountdetails.deadlettermessagecount.aspx">MessageCountDetails.DeadletterMessageCount</a> property.&nbsp;</li>
</ul>
<p><img style="margin-right: auto; margin-left: auto; float: none; display: block;" src="http://i1.code.msdn.s-msft.com/windowsazure/service-bus-explorer-f2abca5a/image/file/114916/1/messagecount.png" alt="" width="416" height="614" /></p>
<p>To enable or disable this feature, you can use the <strong>showMessageCount</strong> setting in the configuration file, or use the new <strong>Show Message Count </strong>checkbox in the <strong>Options Form </strong>as shown in the picture below.</p>
<p><img style="margin-right: auto; margin-left: auto; float: none; display: block;" src="http://i1.code.msdn.s-msft.com/windowsazure/service-bus-explorer-f2abca5a/image/file/114917/1/optionsform.png" alt="" width="620" height="604" /></p>
<ul>
<li>As shown in the figure below, numbers in the property list of queues, topics, subscriptions, and notification hubs are now formatted to make it easier to read their value.</li>
</ul>
<p><img style="margin-right: auto; margin-left: auto; float: none; display: block;" src="http://i1.code.msdn.s-msft.com/windowsazure/service-bus-explorer-f2abca5a/image/file/114918/1/formatting.png" alt="" width="352" height="476" /></p>
<ul>
<li>Replaced the logo to reflect the recent change of name from <strong>Windows Azure</strong> to <strong>Microsoft Azure</strong>.</li>
</ul>
<p><img style="margin-right: auto; margin-left: auto; float: none; display: block;" src="http://i1.code.msdn.s-msft.com/windowsazure/service-bus-explorer-f2abca5a/image/file/114984/1/logo.png" alt="" width="199" height="158" /></p>]]></content:encoded>
    </item>
    <item>
      <title>Released listener for queues and subscriptions in the Service Bus Explorer</title>
      <link>https://docs.microsoft.com/archive/blogs/paolos/released-listener-for-queues-and-subscriptions-in-the-service-bus-explorer</link>
      <pubDate>Wed, 18 Dec 2013 06:41:51 GMT</pubDate>
      <dc:creator><![CDATA[Paolo Salvatori]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/paolos/2013/12/18/released-listener-for-queues-and-subscriptions-in-the-service-bus-explorer/</guid>
      <description><![CDATA[I just released an improved version of the Service Bus Explorer 2.1 and 2.2.  The zip file contains:...]]></description>
      <content:encoded><![CDATA[<p>I just released an improved version of the <a href="http://code.msdn.microsoft.com/windowsazure/Service-Bus-Explorer-f2abca5a">Service Bus Explorer 2.1 and 2.2</a>.</p>  <p>The zip file contains: </p>  <ul>   <li>The source code for the Service Bus Explorer 2.2.1.1. This version of the tool uses the <a href="http://www.nuget.org/packages/WindowsAzure.ServiceBus/">Microsoft.ServiceBus.dll</a> 2.2.1.1 that is compatible with the current version of the Windows Azure Service Bus, but not with the Service Bus 1.1, that is, the current version of the on-premises version of the Service Bus. </li>    <li>The Service Bus Explorer 2.1. This version can be used with the Service Bus 1.1. The Service Bus Explorer 2.1 uses the <a href="http://www.nuget.org/packages/WindowsAzure.ServiceBus/">Microsoft.ServiceBus.dll</a> client library which is compatible with the Service Bus for Windows Server 1.1 RTM version, but not with the 1.1 Beta version or the Service Bus for Windows Server 1.0. For this reason, for those of you that are still using the Service Bus for Windows Server version 1.0, I included the old version (1.8) of the Service Bus Explorer in a zip file called 1.8 which in turn is contained in the zip file of the current version. The old version of the Service Bus Explorer uses the Microsoft.ServiceBus.dll 1.8 which is compatible with the Service Bus for Windows Server. For those of you that are instead using the Service Bus for Windows Server 1.1 Beta, you can download the Service Bus Explorer 2.0 from my <a href="http://sdrv.ms/15GEcgz">SkyDrive</a>. </li>    <li>The Service Bus Explorer 1.8. This version can be used with the Service Bus 1.0</li> </ul>  <p>This version introduces the following updates for both the 2.1 and 2.2 version:</p>  <ul>   <li>Introduced a new command to start one or more listeners for a given queue or subscription. Right click the queue or subscription and select, respectively, <strong>Create Queue Listerner</strong> or <strong>Create Subscription Listener</strong> from the context menu as shown in the following picture.</li> </ul>  <p><img style="margin-right: auto; margin-left: auto; float: none; display: block;" alt="" src="http://i1.code.msdn.s-msft.com/windowsazure/service-bus-explorer-f2abca5a/image/file/104717/1/listener04.png" width="800" height="901" /></p>  <ul>   <li>In the listener dialog you can set the following properties:      <ol>       <li><a href="http://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.onmessageoptions.maxconcurrentcalls.aspx">MaxConcurrentCalls</a>: gets or sets the maximum number of concurrent calls to the callback the message pump should initiate. </li>        <li>Refresh Interval (sec): sets a refresh interval in seconds for queue or subscription message count information. </li>        <li>Graph: enable or disable the graph. </li>        <li><a href="http://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.onmessageoptions.autocomplete.aspx">AutoComplete</a>: gets or sets a value that indicates whether the message-pump should call <a href="http://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.queueclient.complete.aspx">Complete(Guid)</a> or <a href="http://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.subscriptionclient.complete.aspx">Complete(Guid)</a> on messages after the callback has completed processing </li>        <li>Tracking: enable or disable message tracking. When enabled, you can use the Messages tab to access messages. </li>        <li>Logging: enable or disable logging. </li>        <li>Verbose: enable or disable verbose mode when logging is enabled.</li>     </ol>   </li> </ul>  <p><img style="margin-right: auto; margin-left: auto; float: none; display: block;" alt="" src="http://i1.code.msdn.s-msft.com/windowsazure/service-bus-explorer-f2abca5a/image/file/104719/1/listener05.png" width="800" height="590" /></p>  <p><img alt="" src="http://i1.code.msdn.s-msft.com/windowsazure/service-bus-explorer-f2abca5a/image/file/104718/1/listener01.png" width="660" height="0" /></p>  <ul>   <li>Press the <strong>Start </strong>button to start the listener. </li> </ul>  <p><img style="margin-right: auto; margin-left: auto; float: none; display: block;" alt="" src="http://i1.code.msdn.s-msft.com/windowsazure/service-bus-explorer-f2abca5a/image/file/104720/1/listener01.png" width="800" height="590" /></p>  <ul>   <li>The <strong>Start </strong>button turns into the <strong>Stop </strong>button.&#160; </li>    <li>Press the <strong>Stop </strong>button to stop the listener.&#160; </li>    <li>Press the <strong>Close </strong>the listener dialog. If the listener is open, this operation closes the listener. </li>    <li>Press the <strong>Clear</strong> button to clear tracked messages and log content. </li>    <li>Press the <strong>Messages</strong> tab to access messages.&#160; </li>    <li>You can click s message row to access its payload, custom and system properties.</li> </ul>  <p><img style="margin-right: auto; margin-left: auto; float: none; display: block;" alt="" src="http://i1.code.msdn.s-msft.com/windowsazure/service-bus-explorer-f2abca5a/image/file/104722/1/listener02.png" width="800" height="590" /></p>  <ul>   <li>Click the the magnifying glass button to define a filter expression for received messages using a SQL Expression (e.g. sys.Size &gt; 300 and sys.Label='Service Bus Explorer' and City='Pisa'). For more information, see <a href="http://msdn.microsoft.com/en-us/library/windowsazure/microsoft.servicebus.messaging.sqlfilter.sqlexpression.aspx">SqlFilter.SqlExpression Property</a>.</li> </ul>  <p><img style="margin-right: auto; margin-left: auto; float: none; display: block;" alt="" src="http://i1.code.msdn.s-msft.com/windowsazure/service-bus-explorer-f2abca5a/image/file/104723/1/listener06.png" width="800" height="590" /></p>  <ul>   <li>Double click a row or click <strong>Repair and Resubmit Message</strong> from the context menu to open a message in the a separate dialog. This functionality allows to clone and send the selected messages to a the same or alternative queue or topic in the <strong>Service Bus </strong>namespace. If you want to edit the payload, system properties or user-defined properties, you have to select, edit and send messages one at a time.</li> </ul>  <p><img style="margin-right: auto; margin-left: auto; float: none; display: block;" alt="" src="http://i1.code.msdn.s-msft.com/windowsazure/service-bus-explorer-f2abca5a/image/file/105723/1/listener03.png" width="800" height="451" /></p>  <ul>   <li>Minor changes:      <ul>       <li>Fixed ListView control visualization when the vertical bar is visible </li>        <li>Increased ReaderQuotas when reading WCF messages. This adds support for large messages.</li>     </ul>   </li> </ul>]]></content:encoded>
    </item>
  </channel>
</rss>