<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>PhatBoyG.com &#187; .NET</title>
	<atom:link href="http://blog.phatboyg.com/category/net/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.phatboyg.com</link>
	<description>Software Architecture, .NET, SOA</description>
	<lastBuildDate>Sat, 04 Feb 2012 02:01:04 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Actor Model Programming in C#</title>
		<link>http://blog.phatboyg.com/2011/11/15/actor-model-programming-in-c/</link>
		<comments>http://blog.phatboyg.com/2011/11/15/actor-model-programming-in-c/#comments</comments>
		<pubDate>Tue, 15 Nov 2011 16:03:35 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[concurrency]]></category>

		<guid isPermaLink="false">http://blog.phatboyg.com/?p=951</guid>
		<description><![CDATA[Last week, I had the pleasure of attending Øredev in Malmö, Sweden. While at the conference, I presented two sessions &#8212; including a new talk on Actor Model Programming in C#. This was the first official presentation I&#8217;ve given on the subject, having done an ad-hoc version of the session at Pablo&#8217;s Fiesta this year [...]]]></description>
			<content:encoded><![CDATA[<p>Last week, I had the pleasure of attending <a href="http://oredev.org/2011">Øredev</a> in Malmö, Sweden. While at the conference, I presented two sessions &#8212; including a new talk on <a href="http://oredev.org/2011/sessions/actor-model-programming-in-c-">Actor Model Programming in C#</a>. This was the first official presentation I&#8217;ve given on the subject, having done an ad-hoc version of the session at <a href="http://pablosfiesta.pbworks.com/w/page/46324025/Actor%20Style%20Programming">Pablo&#8217;s Fiesta</a> this year (which went fairly well, likely due to the awesome <a href="http://24diner.com/wp-content/uploads/2011/02/waffle_staff.jpg">Chicken and Waffles</a> at <a href="http://24diner.com/">24 Diner</a> the night before). Early feedback from the Øredev session was positive, which is encouraging since I will be giving an updated version of the talk at CodeMash 2.0.1.2 in January.</p>
<p>First, I wanted to share a few links to the content discussed in the session, including the <a href="http://github.com/phatboyg/Stact">GitHub Project</a>, the <a href="http://nuget.org/List/Packages/Stact">NuGet package</a>, and the <a href="http://teamcity.codebetter.com/viewType.html?buildTypeId=bt258&amp;tab=buildTypeStatusDiv">TeamCity build</a>. I will update the post with the video link once the presentation video is available, along with the slide deck.</p>
<p>Second, I plan to post a series of blog posts explaining how actor model programming is a great model for building concurrent applications, despite the difficulties that the actor model has had in becoming more mainstream (some of those difficulties are explaining in <a href="http://www.doc.ic.ac.uk/~nd/surprise_97/journal/vol2/pjm2/">this article by Paul Mackay</a>).</p>
<p>In the meantime, I&#8217;m going to take a hard look at how different languages have implemented the actor model (many of which have influenced the current syntax used in Stact). I&#8217;m also taking a step back and identifying other ways the model can be implemented the minimize many of the difficulties and bring some modern programming style to the model. Concurrency is certainly difficult, but I&#8217;m convinced that many aspects can be made more approachable by applying some existing idioms to the problem.</p>
<p>If you do take a look at Stact, please offer any feedback you have via Twitter (I&#8217;m <a href="https://twitter.com/#!/phatboyg">@PhatBoyG</a>) or GitHub (using issues, whatever). If the traffic grows, we&#8217;ll setup a Google group to keep things manageable.</p>
<p>Until next time&#8230;</p>
<p> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.phatboyg.com/2011/11/15/actor-model-programming-in-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MassTransit v2.0 Beta Available Now on NuGet!</title>
		<link>http://blog.phatboyg.com/2011/05/03/masstransit-v2-0-beta-available-now-on-nuget/</link>
		<comments>http://blog.phatboyg.com/2011/05/03/masstransit-v2-0-beta-available-now-on-nuget/#comments</comments>
		<pubDate>Wed, 04 May 2011 02:35:26 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[ActiveMQ]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[MassTransit]]></category>
		<category><![CDATA[MSMQ]]></category>
		<category><![CDATA[RabbitMQ]]></category>

		<guid isPermaLink="false">http://blog.phatboyg.com/?p=945</guid>
		<description><![CDATA[After what seems like a long slumber, along with work being done on other projects such as Topshelf and Stact, it is our great pleasure to announce the first beta release of MassTransit v2.0. What originally started out as a minor “1.3” update has turned into a full-out cleanup of the codebase, including a refinement [...]]]></description>
			<content:encoded><![CDATA[<div>
<p>After what seems like a long slumber, along with work being done on other projects such as Topshelf and Stact, it is our great pleasure to announce the first beta release of MassTransit v2.0. What originally started out as a minor “1.3” update has turned into a full-out cleanup of the codebase, including a refinement of the configuration API. Since there were some breaking changes to the configuration, we felt a 2.0 moniker was better to ensure users of the framework understood the depth of the changes made.</p>
<p>And what a list of changes it is (TL;DR = We filled it with awesomeness): </p>
<ol>
<li>
<p>Configuration <br />MassTransit v2.0 now includes a streamlined configuration model built around an extensible fluent interface (inspired by Stact and Topshelf and sharing a common, consistent design). As a result, getting started with MassTransit is now easier than ever. In version 2.0, all configuration starts with the <em>ServiceBusFactory</em> and Intellisense guides you from there forward. The result is a clean, understandable API and a quicker out-of-the-box experience.</p>
</li>
<li>
<p>Container-Free Support<br />With the release of MassTransit 2.0, using a dependency injection container is now <strong>optional</strong>. When we started MassTransit, we leveraged the container extensively to assemble the internal workings of the bus. As we added support for other containers, required features that were not supported by a particular container led to some creative solutions (read: hacks) that were less than optimal. By moving away from a “container-first” approach, we have increased the reliability of the software and now provide container-specific extensions to subscribe consumers from the container in one simple step. We also threw in support for Autofac!</p>
</li>
<li>
<p>Quick-Start<br />By simplifying the configuration, and dropping the need for a container, it is now fast and easy to get started using our new QuickStart:<br /><a href="http://docs.masstransit-project.com/en/latest/configuration/quickstart.html">http://docs.masstransit-project.com/en/latest/configuration/quickstart.html</a></p>
</li>
<li>
<p>#NuGet<br /><a href="http://nuget.org/List/Search?packageType=Packages&amp;searchCategory=All+Categories&amp;searchTerm=MassTransit&amp;sortOrder=package-download-count&amp;pageSize=10">NuGet packages have been added for the base MassTransit</a> project, with any external dependencies (log4net and Magnum) resolved using the proper NuGet packages. Any additional references are downstream in additional NuGet packages, such as support for persisting sagas using NHibernate (MassTransit.NHibernate), and the various dependency injection containers supported.</p>
</li>
<li>
<p>Multiple Subscription Service Options<br />In addition to the existing <em>RuntimeServices</em> included with MassTransit, an all-new peer-to-peer subscription service has been added. By leveraging the reliable multi-cast support in MSMQ, services can now exchange subscription information without the need for a centralized subscription service. To ensure everything is setup correctly, a <em>VerifyMsmqConfiguration</em> method has been added that will check the installation of MSMQ and install any missing components. This is the first iteration of multi-cast support, and we need to get some mileage on it. In the meantime, the original run-time services continue to work as expected.</p>
</li>
<li>
<p>Documentation<br />Which brings us to the next big update. DOCS! They’re not perfect, and they’re far from complete, but we have focused on the configuration story to help get you up and running. As we see a need for more documentation in a given area, we will continue to flush out the docs appropriately. The docs are located at <a href="http://docs.masstransit-project.com/">http://docs.masstransit-project.com/</a> and are being hosted by the fine people at <a href="http://readthedocs.org/">http://readthedocs.org</a>. [Thanks <a href="http://ericholscher.com/">Eric</a>!]</p>
</li>
<li>
<p>Support for .NET 4.0 and .NET 3.5<br />The project files and solution have all been updated to Visual Studio 2010 SP1. By default, all projects are now built in the IDE targeting .NET 4.0. The command-line build (which has been revamped to use Rake and Albacore) builds both .NET 3.5 and .NET 4.0 assemblies, including the run-time services and System View. The NuGet packages also include the proper bindings for the target project run-time version (you must use the <strong>full .NET 4.0 profile</strong> with MassTransit, the client profile is not supported). </p>
</li>
<li>
<p>Transport Support<br />Internally, the transports and endpoints have been redesigned to improve the support for new transports like RabbitMQ (and improve our ActiveMQ support). For example, transports are now inbound, outbound, or both, allowing us to properly leverage fan-out exchanges on RabbitMQ for publishing and subscribing to messages. There is more to come in this area as we take greater advantage of these advanced transport features. If you’re a RabbitMQ or ActiveMQ user and don’t mind getting your hands dirty, now is a great time to jump in and help improve transport support.</p>
</li>
<li>
<p>Distributor Consumer And Saga Support<br />Work on the MassTransit distributor subsystem continues to be improved. Testing on a multi-master system has been completed which will allow it to serve multiple distributors to improve load balancing efficiency. Support for all sagas (previously only state machine sagas were supported) has been added as well.</p>
</li>
<li>
<p>Swinging the Feature Axe<br />Some previous troublesome and poorly supported features (Batching and Message Grouping) were removed from the 2.0 release to reduce code complexity. Also in light of the new Parallel Tasks work in the framework the Parallel namespace has been removed.</p>
</li>
</ol>
<p>In the next few days, I&#8217;ll be posting an annotated walkthrough of the new configuration API. In the meantime, fire up Visual Studio 2010, create ConsoleApplication69, switch to the full .NET 4.0 framework, and Add a Library Package Reference to MassTransit using NuGet. Paste the code from the <a href="http://docs.masstransit-project.com/en/latest/configuration/quickstart.html">Quick Start</a> into your program.cs and check it out!</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.phatboyg.com/2011/05/03/masstransit-v2-0-beta-available-now-on-nuget/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MassTransit Update</title>
		<link>http://blog.phatboyg.com/2010/05/04/masstransit-update/</link>
		<comments>http://blog.phatboyg.com/2010/05/04/masstransit-update/#comments</comments>
		<pubDate>Tue, 04 May 2010 20:51:22 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[MassTransit]]></category>

		<guid isPermaLink="false">http://blog.phatboyg.com/?p=925</guid>
		<description><![CDATA[It&#8217;s been a while since I&#8217;ve posted about MassTransit, the .NET distributed application framework and service bus that Dru Sellers, myself, and several other contributors have been working on for the past 2.5 years. This is mostly due to a pretty heavy schedule in the first quarter (CodeMash, the MVP Summit, Pablo&#8217;s Fiesta, the North [...]]]></description>
			<content:encoded><![CDATA[<p>
It&#8217;s been a while since I&#8217;ve posted about MassTransit, the .NET distributed application framework and service bus that Dru Sellers, myself, and several other contributors have been working on for the past 2.5 years. This is mostly due to a pretty heavy schedule in the first quarter (CodeMash, the MVP Summit, Pablo&#8217;s Fiesta, the North Dallas .NET User Group, and having an in-ground swimming pool built), along with a lot of exploratory coding on some new features for the framework.
</p>
<p>
While traveling to community events, it&#8217;s amazing to run into folks that are using MassTransit in their applications &#8212; particularly ones that I&#8217;ve never heard from before. It&#8217;s a cool feeling to know that people are finding value in the effort we&#8217;ve put into it. Over the past few months, several organizations have been finalizing the testing of new applications built on top of MassTransit, taking advantage of the state-driven saga support (including the new distributor for load balancing saga instances across servers), in preparation for production launches. Several contributors have offered tremendous help with this new functionality, including development of and testing with the distributor support.
</p>
<p>
It is great to see users of the framework taking an active role in shaping the feature set to meet a more generalized set of requirements. When Dru and I started creating MassTransit, we had a fairly narrow feature set that needed to be implemented. As the use of messaging in our applications expanded, we started to identify new features that would provide additional benefits. Being able to harvest application-specific code into the framework has provided a high level of reuse which helps everyone.
</p>
<h3>GitHub</h3>
<p>
The biggest move that we made in the past few months was leaving GoogleCode behind and migrating the project to <a href="http://github.com/phatboyg">GitHub</a>. If you have not yet discovered it yet, Git is an amazing distributed version control system that offers tremendous flexibility when working on highly distributed projects, such as open source projects. Combined with the amazing social collaboration that occurs on GitHub, we have merged significantly more features from contributors on GitHub in the past few months than we had previously received the entire time we were hosted at GoogleCode. Many have forked the <a href="http://github.com/phatboyg/MassTransit">main project</a> (which is hosted on <a href="http://github.com/phatboyg">my GitHub account</a>, and is also used to drive <a href="http://teamcity.codebetter.com/project.html?projectId=project6&#038;tab=projectOverview">the official builds</a> on the CodeBetter TeamCity server) and made changes that I have merged into the main project.
</p>
<p>
You can still download a compressed archive of the latest source from GitHub by clicking the <a href="http://github.com/phatboyg/MassTransit">download source</a> link on the <a href="http://github.com/phatboyg/MassTransit">project source</a> page. You can also <a href="http://teamcity.codebetter.com/viewType.html?buildTypeId=bt8&#038;tab=buildTypeStatusDiv">download the latest build</a> (or the <a href="http://teamcity.codebetter.com/viewLog.html?buildId=10337&#038;buildTypeId=bt8&#038;tab=artifacts">tagged v1.0 build</a>) from the TeamCity artifacts link. The build runs automatically when code is push to GitHub, so the latest build is always from the latest bits in the master branch.
</p>
<h3>Major Milestone</h3>
<p>
On March 1st, we marked a v1.0 release candidate of <a href="http://masstransit-project.com/">MassTransit</a> (and the related projects <a href="http://topshelf-project.com/">Topshelf</a> and <a href="http://magnum-project.net/">Magnum</a>). With open source projects there is always a syndrome of 0.x, where many projects never reach 1.0 yet are still used in production systems at multiple organizations. Considering the number of organizations using MassTransit (and even Topshelf by itself for hosting Windows services), we decided it was time to mark the release 1.0 and freeze the feature set for that line of the codebase.
</p>
<p>
Since the 1.0 release candidate, there has been very little active development on the MassTransit codebase. The reason for this is simple, we wanted to allow the framework a little time to soak into the community. There are a lot of features that we want to put into the framework, and several of these are under heavy development outside of the master codebase, but the main feature set for 1.0 was released to allow organizations to go forward with implementations that were waiting on an official release.
</p>
<h3>Documentation</h3>
<p>
We have heard you, and we are going to start improving the documentation. We&#8217;ve set up a site specific to each project (<a href="http://masstransit-project.com/">MassTransit</a>, <a href="http://topshelf-project.com/">Topshelf</a>, <a href="http://magnum-project.net/">Magnum</a>) and are going to be harvesting the <a href="http://masstransit.pbworks.com/">content from the wiki</a> to create a reference set of documentation for using MassTransit. Hopefully we can take some of the questions from <a href="http://groups.google.com/group/masstransit-discuss">the discussion list</a> and get them into a QA/FAQ section as well.
</p>
<p>
<em>As an aside, I started this post based on a purse fight that was held on Twitter this morning in regards to OSS activity in the .NET community. It is certainly important as an open source project owner to keep the lines of communication flowing in regards to the project status, new features, and roadmap. I plan to work with Dru over the next few days to get these details laid out on the web site so that we can get feedback from the community.</em>
</p>
<p>
In the next few weeks, I hope to start detailing out some of the 2.0 features that are planned for MassTransit. There are several exciting features in the <em>pipeline</em>, including an entirely new set of edge components for interfacing with clients connected via Ajax/JSON, WCF, or regular web services. As I get my act<span style="color:white;">ors</span> together, I hope to post some details, as well as complete my series on building a service gateway using the new edge components.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.phatboyg.com/2010/05/04/masstransit-update/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Codemash ASP.NET MVC Demo Code</title>
		<link>http://blog.phatboyg.com/2010/01/22/codemash-asp-net-mvc-demo-code/</link>
		<comments>http://blog.phatboyg.com/2010/01/22/codemash-asp-net-mvc-demo-code/#comments</comments>
		<pubDate>Fri, 22 Jan 2010 14:49:37 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[MVC]]></category>

		<guid isPermaLink="false">http://blog.phatboyg.com/?p=905</guid>
		<description><![CDATA[Last week I presented at Codemash on ASP.NET MVC. I received a request for the demo code, which you can download here. Codemash was an awesome event, one that hope to attend again in the future!]]></description>
			<content:encoded><![CDATA[<p>Last week I presented at Codemash on ASP.NET MVC. I received a request for the demo code, which you can <a href="http://blog.phatboyg.com/wp-content/uploads/2010/01/mvc2.zip" title="mvc2.zip">download here</a>.</p>
<p>Codemash was an awesome event, one that hope to attend again in the future!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.phatboyg.com/2010/01/22/codemash-asp-net-mvc-demo-code/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Performance Counters Added to MassTransit</title>
		<link>http://blog.phatboyg.com/2009/10/14/performance-counters-added-to-masstransit/</link>
		<comments>http://blog.phatboyg.com/2009/10/14/performance-counters-added-to-masstransit/#comments</comments>
		<pubDate>Wed, 14 Oct 2009 14:55:32 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[MassTransit]]></category>
		<category><![CDATA[C++]]></category>

		<guid isPermaLink="false">http://blog.phatboyg.com/?p=835</guid>
		<description><![CDATA[One feature that is often overlooked in software development is the output of information that can be observed by operations once the application is in production. Fortunately, many open source projects are leveraging log4net to provide a configurable level of runtime information that can be useful in figuring out why a system is behaving a [...]]]></description>
			<content:encoded><![CDATA[<p>One feature that is often overlooked in software development is the output of information that can be observed by operations once the application is in production. Fortunately, many open source projects are leveraging <a href="http://logging.apache.org/log4net/index.html">log4net</a> to provide a configurable level of runtime information that can be useful in figuring out why a system is behaving a certain way (and face, if you&#8217;re looking, it&#8217;s more than likely behaving badly). Logging, however, is only one view into an application &#8212; one that might not deliver the appropriate information in a useful way.</p>
<p>Anyone who has used a computer with any interest is familiar with system monitoring tools. Task Manager (or if you&#8217;re really cool Process Explorer) is the first place Windows users look when their system starts to crawl, Mac users turn to Activity Monitor, and I&#8217;m sure Linux users have some really obscure command-line tool as well. These coarse grained tools are usually enough for users, however, an operations team needs a higher degree of visibility into application &#8212; particularly if they are expected to determine how to tune the application for better performance.</p>
<p>For operations on Windows, Performance Monitor provides detailed information for running applications in real-time. On a web server, it is easy to find out how many threads your ASP.NET application is using, as well as how many requests are queued. That information can be correlated with processor utilization to help determine if the bottleneck is the CPU, the network, or possibly even the database server. When it comes to troubleshooting issues on a live system, more information is always helpful to determine the source of the problem.</p>
<p>To support this level of visibility in <a href="http://code.google.com/p/masstransit/">MassTransit</a>, performance counter support has been added. Performance counters in .NET are part of the System.Diagnostics namespace. There are various counter types that can be defined, including counts, rates, and averages. When an application wants to output performance counters, it has to create a category and specify the counters that are included in the category. For instance:</p>
<pre class="brush: csharp; title: ; notranslate">
ConsumerThreadCount = new RuntimePerformanceCounter(&quot;Consumer Threads&quot;,
	&quot;The current number of threads processing messages.&quot;,
	PerformanceCounterType.NumberOfItems32);

ReceiveRate = new RuntimePerformanceCounter(&quot;Received/s&quot;,
	&quot;The number of messages received per second&quot;,
	PerformanceCounterType.RateOfCountsPerSecond32);
</pre>
<p>These are two of the counters defined by the MassTransit category. The first is a count that is updated when the number of threads in use changes. The second is a rate which gets incremented once for every message received. The actual calculation and display of the rate is handled by the performance monitoring tools &#8211; the application does not need to calculate it.</p>
<pre class="brush: csharp; title: ; notranslate">
ConsumerDuration = new RuntimePerformanceCounter(&quot;Average Consumer Duration&quot;,
	&quot;The average time a consumer spends processing a message.&quot;,
	PerformanceCounterType.AverageCount64);

ConsumerDurationBase = new RuntimePerformanceCounter(&quot;Average Consumer Duration Base&quot;,
	&quot;The average time a consumer spends processing a message.&quot;,
	PerformanceCounterType.AverageBase);
</pre>
<p>This counter is used to report the average consumer duration of a message. For an average, two counters are used. One is the base which is incremented for each occurrence and the counter is the actual count that is added. So for each message, the base is incremented once and the duration is incremented by the amount of time spent executing the consumer.</p>
<p>In adding performance counter support, I wanted to do it in a way that didn&#8217;t leak the details of updating performance information throughout the framework. It was at this point that I turned to the <a href="http://blog.phatboyg.com/2009/07/27/event-aggregator-using-the-magnum-pipeline/">Magnum Pipeline</a>. Using the pipeline to publish the metrics allowed me to isolate the actual performance counter interface to a single method in a single class for the service bus. So instead of passing interfaces around all the components that make up the bus, a single event aggregator is passed instead. When you start up the bus, the performance counter code subscribes to the events as shown:</p>
<pre class="brush: csharp; title: ; notranslate">
_eventAggregatorScope.Subscribe&lt;MessageReceived&gt;(message =&gt;
	{
		_counters.ReceiveCount.Increment();
		_counters.ReceiveRate.Increment();
		_counters.ReceiveDuration.IncrementBy((long) message.ReceiveDuration.TotalMilliseconds);
		_counters.ReceiveDurationBase.Increment();
		_counters.ConsumerDuration.IncrementBy((long) message.ConsumeDuration.TotalMilliseconds);
		_counters.ConsumerDurationBase.Increment();
	});
</pre>
<p>Now, when the bus receives a message, it sends the event to the event aggregator (an instance of the Magnum Pipeline).</p>
<pre class="brush: csharp; title: ; notranslate">
var message = new MessageReceived
	{
		MessageType = messageType,
		ReceiveDuration = receiveTime,
		ConsumeDuration = consumeTime,
	};

	_eventAggregator.Send(message);
</pre>
<p>Since the Magnum Pipeline is publish/subscription, additional consumers could also opt-in to the MessageReceived event and perform other actions as well. I also plan to add counters per message type, allowing a finer grained view at message counts and consumer durations.</p>
<p>While the main story behind this post is the new counters available in MassTransit, my hope is that this brief introduction to performance counters was useful as well. You can learn more about performance counters from various articles that have been posted (such as <a href="http://www.codeproject.com/KB/aspnet/DOTNETBestPractices3.aspx">a good one </a>on CodeProject). You can check out the <a href="http://blog.phatboyg.com/2009/07/27/event-aggregator-using-the-magnum-pipeline/">Magnum Pipeline</a> in the <a href="http://magnum-project.net/">Magnum</a> project which is <a href="http://code.google.com/p/magnum/">hosted at GoogleCode</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.phatboyg.com/2009/10/14/performance-counters-added-to-masstransit/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Interface Subscriptions Now Supported by MassTransit</title>
		<link>http://blog.phatboyg.com/2009/09/16/interface-subscriptions-now-supported-by-masstransit/</link>
		<comments>http://blog.phatboyg.com/2009/09/16/interface-subscriptions-now-supported-by-masstransit/#comments</comments>
		<pubDate>Thu, 17 Sep 2009 01:42:21 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[ActiveMQ]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[MassTransit]]></category>
		<category><![CDATA[MSMQ]]></category>

		<guid isPermaLink="false">http://blog.phatboyg.com/?p=826</guid>
		<description><![CDATA[Last year when we were reviewing the backlog of items that we wanted to build for MassTransit, one item that kept rising to the top of the list is a solid story for evolving message producers over the lifecycle of an enterprise system. Being able to publish events that current and down-level subscribers could consume [...]]]></description>
			<content:encoded><![CDATA[<p>Last year when we were reviewing the backlog of items that we wanted to build for MassTransit, one item that kept rising to the top of the list is a solid story for evolving message producers over the lifecycle of an enterprise system. Being able to publish events that current and down-level subscribers could consume was a key goal to avoid having to upgrade systems all at once when a publisher is updated. Fortunately, it hasn&#8217;t been a real concern in our application since we deploy the entire system as a whole with each delivery.</p>
<p>Nonetheless, a way to update a service that publishes messages without requiring every subscribing service to be updated at the same time was need.</p>
<h3>Eliminating Impediments</h3>
<p>Before we could implement interface subscriptions, there were a few things in the way that needed to be addressed, things that were not easy to implement.</p>
<p>First, we were still doing binary message serialization. While we had the ability to use the .NET XML Serializer, it tends to be slow and difficult to fit into the model we had built with MT. Back in May, <a href="http://blog.phatboyg.com/2009/05/27/masstransit-now-speaks-xml-by-default-2/">XML became the default serialization format</a> using an entirely new serializer built from scratch.</p>
<p>Second, we wanted to ensure that a publisher could publish a single message and have it delivered to all of the interested subscribers regardless of whether they had subscribed to the message class or one of the interfaces implemented by the class. In MassTransit, subscriptions are added by type a defined using a plain old CLR object (POCO). <a href="http://blog.phatboyg.com/2009/03/30/masstransit-06-release-candidate/">In the 0.6 release</a>, we replaced the message dispatcher with a new type-based pipeline for both inbound and outbound messages. Starting with an object and working down the type structure of the message, messages are pushed through the pipeline to interested message sinks. In the case of the outbound pipeline, it makes it easy to push a class through that has interfaces, since the interfaces can be assigned from the message object. Another hurdle eliminated.</p>
<h3>Implementing Interfaces</h3>
<p>
Once the hurdles were eliminated, it was actually very easy to add interface subscriptions. Since most of the internal bits had been reworked leveraging the power of expressions and generics, it was simply a matter of tweaking a few parts of the serializer and we were ready to rock and roll. Ensuring that message objects retain their type through the various pathways inside the system was also important, and resulted in fixing a couple of low hanging bugs related to message retry and fault publishing.
</p>
<p>
The one bit of code that needed to be built was a way to provide a backing class for an interface to store the property values. At first, I looked at using something like LinFu or DynamicProxy2 to create a proxy for the interface and intercept the property accessors, but this had a problem. I did not want property setters on the interface. At that point, I started looking at using the Emit classes, AutoMapper, the FastProperty expression-based accessors, and how Udi had dealt with it inside NServiceBus. What I ended up with was a very fast, cached object builder implementation that is integrated within the message deserializer. In the words of Cartman, &#8220;It&#8217;s pretty cool.&#8221;
</p>
<p>
There isn&#8217;t really a difference in the code between using classes and interfaces from either the producing or consuming end. While a producer will likely continue to publish a class, it just has to implement the message interface on that class, allowing the consumer to subscribe to the interface, breaking the dependency on the actual class published by the producer. The pipeline will then properly serialize out a message for that interface and send it directly to the consumer.
</p>
<p>
I&#8217;m pretty excited about this, and hope to update some of the pre-built services to use interfaces instead of classes in the near future. In the meantime, pull down the latest trunk and check it out.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.phatboyg.com/2009/09/16/interface-subscriptions-now-supported-by-masstransit/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Under the Covers with MassTransit Endpoints</title>
		<link>http://blog.phatboyg.com/2009/09/12/under-the-covers-with-masstransit-endpoints/</link>
		<comments>http://blog.phatboyg.com/2009/09/12/under-the-covers-with-masstransit-endpoints/#comments</comments>
		<pubDate>Sat, 12 Sep 2009 17:20:38 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[MassTransit]]></category>
		<category><![CDATA[MSMQ]]></category>

		<guid isPermaLink="false">http://blog.phatboyg.com/?p=810</guid>
		<description><![CDATA[This post details some of the internal changes to how MassTransit, an open-source lightweight service bus, communicates with transports such as MSMQ, ActiveMQ, and TIBCO. These changes are not likely to impact anyone using MassTransit, they are all well below the abstraction layer provided by the bus. At the same time, I felt it was [...]]]></description>
			<content:encoded><![CDATA[<p>
<em>This post details some of the internal changes to how <a href="http://code.google.com/p/masstransit/">MassTransit</a>, an open-source lightweight service bus, communicates with transports such as MSMQ, ActiveMQ, and TIBCO. These changes are not likely to impact anyone using MassTransit, they are all well below the abstraction layer provided by the bus. At the same time, I felt it was important to share the change, along with the reasons it was made, with those that are using MassTransit.</em>
</p>
<p>
When <a href="http://code.google.com/p/masstransit/">MassTransit</a> was first started, MSMQ was the only transport we intended to support. In due time, however, it was determined that support for transports such as ActiveMQ and TIBCO was important. The ability to run on Linux and OS X under Mono (which does not support the System.Messaging namespace) as well as interoperability with Java systems using JMS (a specification for messaging, implemented by messaging systems like ActiveMQ and TIBCO) were the primary drivers of this decision. At the same time, insulating developers from the particulars of each transport was equally important.
</p>
<p>
To communicate with an endpoint, MassTransit uses the <em>IEndpoint</em> interface. The service bus would receive messages from an endpoint using this method:
</p>
<pre class="brush: csharp; title: ; notranslate">
IEnumerable&lt; IMessageSelector &gt; SelectiveReceive(TimeSpan timeout);
</pre>
<p>
This involved making a call that returned an enumeration of message selectors, allowing the caller to step through the messages until an interesting message (in the case of the bus, a message with a subscribed consumer). The concerns of receiving a message were seemingly spread at random across three or four different classes (and yes, I wrote this crap). The reason for the complexity was solid though &#8211; I need the ability to selectively receive a message from a queue and skip over ones in which I have no interest.
</p>
<p>
The complexity of dealing with the yield return/break syntax of enumerators and managing scope is difficult. The programming semantics behind it are difficult to understand. I wanted something better. With all the time I&#8217;ve been spending since this was written dealing with nested closures, lambda functions, and continuations I realized there was a better way to reduce the complexity while at the same time improving extensibility.
</p>
<p>
The new signature for the receive method on an endpoint looks like this:
</p>
<pre class="brush: csharp; title: ; notranslate">
void Receive(Func&lt; object, Action&lt; object &gt; &gt; receiver, TimeSpan timeout);
</pre>
<p>
With this new interface, the caller need only pass a method that accepts an object and returns a method that also accepts an object. The first method provides the caller an opportunity to inspect the message object to determine if the message will be consumed by the bus. If the bus is not interested, it can simply return null. If it is interested, it returns a method (either anonymous or a regular class method) that will consume the message. The endpoint will then call the returned method with the message once it has been received successfully. If the endpoint determines that the message is no longer available (if it were picked up by another process reading from the same queue for example), the returned method is not called.
</p>
<p>
The calling method looks something like this:
</p>
<pre class="brush: csharp; title: ; notranslate">
_endpoint.Receive(m =&gt; message =&gt; { doSomethingWith(message); });
</pre>
<p>
This interface is far less complex to implement, and also made it easy to make a clean separation of what is an endpoint and what is a transport. Which leads me to&#8230;
</p>
<h3>Endpoint and Transport Split?</h3>
<p>Sadly that reads like a Hollywood headline, but it is true. <strong>Endpoints</strong> now deal only with address resolution of sending and receiving messages and translating between the transport format and a message object (including de/serialization). New <strong>transport</strong> classes are now responsible for the actual communication with the various queue implementations supported by MassTransit.
</p>
<p>
For example, previously there was one class, MsmqEndpoint, that contained all the aspects of talking to MSMQ regardless of the type of queue (local non-transactional, local transactional, remote). Now beneath the endpoint itself, there are three MSMQ transports, one for each of these scenarios. Each of these transports cleanly deals with the particulars only, for example, the non-transactional transport has no transactional concerns in it at all.
</p>
<h4>Introducing ITransport</h4>
<p>The new ITransport interface is narrow, dealing only with the simplest form of communication &#8212; streams. The send and receive methods from the endpoint are matched, but instead of dealing with objects, streams are used. Every transport should provide stream support at a minimum. The receive method of the transport looks like:</p>
<pre class="brush: csharp; title: ; notranslate">
void Receive(Func&lt; Stream, Action&lt; Stream &gt; &gt; receiver, TimeSpan timeout);
</pre>
<p>
While all transports implement streams, there is a benefit to communicating at a level above streams for certain types of endpoints. For example, when using MSMQ there are advantages to communicating directly with the Message object such as having access to the transport level message ID, the message label, and other interesting properties. To support this, the MsmqEndpoint only accepts an IMsmqTransport interface, which inherits from ITransport and adds:
</p>
<pre class="brush: csharp; title: ; notranslate">
void Receive(Func&lt; Message, Action&lt; Message &gt; &gt; receiver, TimeSpan timeout);
</pre>
<p>
Other transports may benefit from a custom interface as well, but it is only implemented for MSMQ at this point. ActiveMQ, Loopback, and Multicast UDP all use the base stream interface.
</p>
<h3>Looking Forward</h3>
<p>
This rewrite was not purely for entertainment value (well, it was fun). Latency when sending a message from a machine to a remote queue is orders of magnitude slower than writing to a local queue. And in addition, local queues have the advantage of being local &#8212; which is important considering the first fallacy of distributed computing &#8212; the network is reliable (NOT!). To compensate for this, a more reliable method of sending messages to a remote queue is needed. By ensuring that messages sent/published by an application are durable regardless of network failure, developers can use this fire-and-forget approach to messaging that is key to building event driven applications.
</p>
<p>
To handle this, MassTransit now uses a store and forward transport for remote MSMQ queues. The store and forward transport will automatically create a local queue to cache the outbound messages destined for the remote queue. When a message is sent to the remote queue, the transport writes it to the local queue and returns to the caller. An asynchronous method then delivers the message in the background. The same transports that are used by the endpoint are reused by the store and forward transport, maintaining that high level of code reuse.
</p>
<p>
<em>Note that on Windows Server 2003, I have observed that MSMQ will accept messages destined for a unreachable remote queue and attempt redelivery itself, but only for transactional queues (at least, that is what I have seen). </em>
</p>
<h3>Wrapping Up</h3>
<p>
While it is always hopeful that changes like this will go by unnoticed, there is always the chance that there are some unintended consequences (read: bugs). Hopefully any of these will be weeded out quickly. In the meantime, I hope to start work on some availability features to support load balancing of command services.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.phatboyg.com/2009/09/12/under-the-covers-with-masstransit-endpoints/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Event Aggregator Using the Magnum Pipeline</title>
		<link>http://blog.phatboyg.com/2009/07/27/event-aggregator-using-the-magnum-pipeline/</link>
		<comments>http://blog.phatboyg.com/2009/07/27/event-aggregator-using-the-magnum-pipeline/#comments</comments>
		<pubDate>Tue, 28 Jul 2009 04:55:16 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://blog.phatboyg.com/?p=798</guid>
		<description><![CDATA[In the past few weeks, both Udi Dahan and Jeremy D. Miller have posted on events. Udi posted about domain events, while Jeremy posted about his use of the event aggregator pattern in StoryTeller. In each case, events are represented as messages and each message is a class in C#. And in each post, a [...]]]></description>
			<content:encoded><![CDATA[<p>In the past few weeks, both <a href="http://www.udidahan.com/2009/06/14/domain-events-salvation/">Udi Dahan</a> and <a href="http://codebetter.com/blogs/jeremy.miller/archive/2009/07/23/how-i-m-using-the-event-aggregator-pattern-in-storyteller.aspx">Jeremy D. Miller</a> have posted on events. Udi posted about domain events, while Jeremy posted about his use of the event aggregator pattern in StoryTeller. In each case, events are represented as messages and each message is a class in C#. And in each post, a small publish/subscribe system is described that allowed objects (be it a domain object, domain service, or a controller) to subscribe to messages. Other objects could then use that same system to publish events to the subscribed objects.</p>
<p>Now while you could use <a href="http://code.google.com/p/masstransit/">MassTransit</a> out of the box to handle this type of event aggregation, it is a bit heavy. The in-memory message transport serializes the message, which makes it impossible to pass a continuation or an object reference as part of an event. There is also a very service-oriented thread model where each consumer runs on a different thread making synchronization an important concern for unit testing. While it would work, it is not always the shiniest hammer in the toolbox for UI-based application.</p>
<p>To address this, one of the things I&#8217;ve been adding to <a href="http://code.google.com/p/magnum/">Magnum</a> over the past few weeks is a new version of the pipeline that handles message distribution in MassTransit. In this implementation, I wanted a way to implement the event aggregator pattern with the same flexibility that I get with MassTransit but designed for an in-process mode of execution. At the same time, I wanted to make sure that I could scale this solution via adapters to extend events to MassTransit for publishing out-of-process.</p>
<p><em>Note, I use the word event and message interchangeably in this post.</em></p>
<p>First, I wanted it to be able to handle any object without any constraints on the type. To this end, I came up with a very narrow API that only deals with the publishing of a message.</p>
<pre class="brush: csharp; title: ; notranslate">
public interface Pipe
{
	void Send&lt; T &gt;(T message) where T : class;
}
</pre>
<p>The <strong>Send</strong> method is fairly obvious, it is used to send a message to any consumers that are subscribed to the message. With this implementation, consumers that are subscribed to any type to which the message can be assigned will also get the message. Consider the following class structure:</p>
<pre class="brush: csharp; title: ; notranslate">
public class CustomerChanged
{
	public Customer Customer { get; set; }
}

public class CustomerRatingDowngraded :
	CustomerChanged
{
}
</pre>
<p>A consumer that subscribed to the <em>CustomerChanged</em> type would receive the message if a <em>CustomerRatingDowngraded</em> message was published. It also works for interfaces, as long as the message object being published supports the interface.</p>
<p>An obvious omission from this API is any method of subscribing consumers to the pipeline. To subscribe to the pipeline, an extension method on the <em>Pipe</em> interface creates a new subscription scope. A subscription scope, represented by the <em>ISubscriptionScope</em> interface, makes changes to the pipeline resulting in the creation of a new pipeline. A series of visitors are used to create a new version of the pipeline with the consumers added, along with another visitor to remove the consumers when they unsubscribe. ISubscriptionScope implements <em>IDisposable</em> so to unsubscribe your application can just dispose of the object.</p>
<p>It is interesting to note that much like the Expression class in .NET, pipelines are immutable. Since pipelines cannot be changed, the need to lock parts of the pipeline during message distribution is removed. By removing the need for locking to ensure safe operation in a concurrent environment, performance improves and blocking is eliminated. At the same time, consumers can subscribe and unsubscribe from the pipeline as needed without disrupting the system.</p>
<pre class="brush: csharp; title: ; notranslate">
public void Start()
{
	// this creates an empty pipeline that accepts any object
	_eventAggregator=PipeSegment.Input(PipeSegment.End());

	_scope=_eventAggregator.NewSubscriptionScope();
	_scope.Subscribe&lt; CustomerChanged &gt;(message=&gt;Trace.WriteLine(&quot;Customer changed: &quot;+message.CustomerName));
}
</pre>
<p>In this example, pipe and scope would likely be member variables that would be released when the containing object is stopped or disposed. Multiple subscriptions can be added to a single scope, each one modifying the pipeline as it is added.</p>
<p>When I discuss event-based programming, I often mention the need for visualization tools in order to ensure the system is performing as expected. In the example above, I could use the TracePipeVisitor to verify that the consumer was indeed subscribed to the pipeline (by calling new TracePipeVisitor() .Trace(_eventAggregator) and viewing the results in the output window).</p>
<p>
<pre>
Input< Object >:
RecipientList< Object >:
     Filter< CustomerChanged >: Allow Magnum.Specs.Pipeline.Messages.CustomerChanged
     RecipientList< CustomerChanged >:
          MessageConsumer< CustomerChanged >:
</pre>
</p>
<p>As consumers are added, the pipeline is built up using a series of PipeSegment classes. The Input segment is the initial entry point to the pipeline and by having the responsibility is the only segment that actually changes in the pipeline. The RecipientList is a one-to-many switch that delivers incoming messages to each consumer. The Filter segment only passes a specific type through the filter, preventing unwanted messages from receiving the consumer. The MessageConsumer actually invokes the method that was subscribed to the message.</p>
<p>In the above example, the message consumer was accepted using the MessageConsumer<t> delegate type, which is analogous to Action</t><t> with T being the message type. Another way to subscribe is to implement the IConsume</t><t> method as shown below.</t></p>
<pre class="brush: csharp; title: ; notranslate">
public class ListViewController :
	IConsume&lt; CustomerChanged &gt;
{
	public ListViewController(ListView customerListView)
	{
		_customerListView = customerListView;
	}
	public void Consume(CustomerChanged message)
	{
		_customerListView.DoSomeUpdate(message.Customer);
	}
}
</pre>
<p>A class can implement the IConsume<t> method to indicate that it is interested in messages of type T. In this case, the CustomerChanged message is of particular interest as it is used to update the user interface in response to a customer change event. The instance of the controller can be subscribed to the pipeline by calling the Subscribe method passing the object reference itself.</t></p>
<pre class="brush: csharp; title: ; notranslate">
public void BootstrapUserInterfaceControllers()
{
	_customerListViewController = new ListViewController(customerListView);

	_scope=_eventAggregator.NewSubscriptionScope();
	_scope.Subscribe(_customerListViewController);
}
</pre>
<p>This is the first in a series of posts about the pipeline in Magnum. As I add the remaining functionality, including asynchronous message consumers, aggregate consumers, and automatic binding to the Magnum StateMachine (similar to how sagas are done using MassTransit), I&#8217;ll post about how they are used. I encourage you to <a href="http://code.google.com/p/magnum/">take a look at the code</a> and particularly the unit tests to see the different ways the pipeline can be used.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.phatboyg.com/2009/07/27/event-aggregator-using-the-magnum-pipeline/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Accessing ActiveMQ on Mac OSX from a Windows VM</title>
		<link>http://blog.phatboyg.com/2009/07/12/accessing-activemq-on-mac-osx-from-a-windows-vm/</link>
		<comments>http://blog.phatboyg.com/2009/07/12/accessing-activemq-on-mac-osx-from-a-windows-vm/#comments</comments>
		<pubDate>Sun, 12 Jul 2009 19:43:19 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[ActiveMQ]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[MassTransit]]></category>
		<category><![CDATA[MSMQ]]></category>

		<guid isPermaLink="false">http://blog.phatboyg.com/?p=792</guid>
		<description><![CDATA[With MassTransit, we support multiple messaging transports, including MSMQ (comes with Windows), ActiveMQ (an open-source Java message broker), and TIBCO EMS (a not-so-open-source message broker). With that in mind, teams building on the Windows platform can comfortably choose MSMQ and enjoy familiar management tools. If your needs expand to multiple platforms, however, the other choices [...]]]></description>
			<content:encoded><![CDATA[<p>With <a href="http://code.google.com/p/masstransit/">MassTransit</a>, we support multiple messaging transports, including MSMQ (comes with Windows), ActiveMQ (an open-source Java message broker), and <a href="http://www.tibco.com/software/messaging/enterprise-message-service/default.jsp">TIBCO EMS</a> (a not-so-open-source message broker). With that in mind, teams building on the Windows platform can comfortably choose MSMQ and enjoy familiar management tools. If your needs expand to multiple platforms, however, the other choices become more important. One of our goals is to enable MassTransit to communicate between services running on Windows, OS X, and Linux. By using the <a href="http://mono-project.com/Main_Page">Mono Project</a> to run .NET code on OS X and Linux, and ActiveMQ to handle the messaging, we&#8217;re pretty confident that we can reach that goal.</p>
<p>To start working towards this endeavor, I had to first get a working test environment. ActiveMQ can run on Windows, Linux, and OS X. Since <a href="http://codebetter.com/blogs/dru.sellers/">Dru Sellers</a> and I both develop on <a href="http://www.apple.com/macbookpro/">Macs</a> using <a href="http://vmware.com/products/fusion/">VMware Fusion</a> to host various versions of Windows, I wanted to install and run ActiveMQ on the Mac host, making it available to any of the virtual machines. I had not really dealt with setting up services on OS X yet, but was happy to learn that it is a pretty slick process to get things installed and running. Hopefully this will help if you decide to do the same.</p>
<p><em>I should note that I am not an ActiveMQ installation/administration expert. I am configuring ActiveMQ for use in a development environment. If you are going to use ActiveMQ in production, make sure it is configured for proper production operation with the appropriate security, storage, etc. That being said, let&#8217;s get started.</em></p>
<h3>Getting Started</h3>
<p>You need to <a href="http://activemq.apache.org/index.html">download ActiveMQ</a>. I got the Linux version by typing in the URL manually to get it to download using Safari. The archive will be unpacked into a tar file automatically by Safari (if not, just double-click it), which you can then open the tar file into a folder by double-clicking it again. If you are a command-line wizard, you already know how to handle the tar.gz files so enjoy.</p>
<p>Move the unpacked folder (apache-activemq-5.2.0 in my case) to the /usr/local folder by opening Terminal and entering:</p>
<p><tt>sudo mv apache-activemq-5.2.0 /usr/local/</tt></p>
<p>While still in terminal, change to the ActiveMQ folder. We need to modify the configuration.</p>
<p><tt>cd /usr/local/apache-activemq-5.2.0<br />
mate conf/activemq.xml</tt></p>
<p>If you aren&#8217;t using <a href="http://macromates.com/">TextMate</a>, well, do whatever you need to do to open that file. I removed a lot of unused things from the file, but your needs may vary. You can <a href="http://blog.phatboyg.com/wp-content/activemq.xml">download my configuration file</a> if you want to use what I am using. You will need to modify the IP addresses to match your environment. I originally tried to use just localhost, but had issues with it connecting from my Windows 7 VM. If this is just a fluke, I&#8217;ll update my file later with my new settings.</p>
<h3>Installing the launch daemon into OS X</h3>
<p>To run ActiveMQ as a service, you need to create a property list that describes the application. This is just an XML file, but we need to create it and put it into the <tt>/Library/LaunchDaemons</tt> folder and call it <tt>com.apache.activemq</tt> so we can identify it later. You can <a href="http://blog.phatboyg.com/wp-content/com.apache.activemq">download my version of the file</a> to save some typing if you prefer.</p>
<div style="text-align:center;">
<p><img src="http://blog.phatboyg.com/wp-content/uploads/2009/07/activemqterminalsetup.png" alt="ActiveMQTerminalSetup.png" border="0" width="640" height="229" /></p>
</div>
<p>Some of these settings can be adjusted if you don&#8217;t want to keep ActiveMQ running all the time. <tt>KeepAlive</tt> will automatically restart the service if it stops for some reason (including manually stopping it) and you can set that to <tt>false</tt> if you want to control it manually.</p>
<p>After creating the file, we need to configure OS X so it knows about the new service. To do this, type the following:</p>
<p><tt>sudo launchctl load /Library/LaunchDaemons/com.apache.activemq<br />
sudo launchctl start com.apache.activemq</tt></p>
<p>Once you have done this, you can verify that it is started by running the OS X Console application (find it in QuickSilver/Spotlight if you don&#8217;t know where it is). Look at the message logs and you can see the startup messages from the service:</p>
<p>
<div style="text-align:center;"><img src="http://blog.phatboyg.com/wp-content/uploads/2009/07/activemqconsolelog.png" alt="ActiveMQConsoleLog.png" border="0" width="640" height="451" /></div>
</p>
<p>So how do we know that we have a working installation? Well, there is an admin console that you can reach by navigating to <tt>http://localhost:8161/admin</tt> that will let you view the queues, topics, etc. that are running. You can also use the JMX tools to dig into the queues as well, including the ability to send messages to the queues directly from the Java console! To get the console started, you need to run <tt>jconsole</tt> from Terminal. Once it is started, you need to connect to the URL that is configured:</p>
<p>
<div style="text-align:center;"><img src="http://blog.phatboyg.com/wp-content/uploads/2009/07/jconsoleconnect.png" alt="JConsoleConnect.png" border="0" width="480" height="380" /></div>
</p>
<p>Once you are in the JConsole, you can view all the queues. It should look like this (well, assuming you&#8217;ve created some queues, which I&#8217;ve done here with the Starbucks sample from MassTransit).</p>
<p>
<div style="text-align:center;"><img src="http://blog.phatboyg.com/wp-content/uploads/2009/07/jconsoleview.png" alt="JConsoleView.png" border="0" width="640" height="542" /></div>
</p>
<p>You can see the default URL that was connected to in the title bar, along with the tree view of all the objects. The more interesting tab is the Operations tab, which lets you run commands against the queue. In fact, you can past some XML straight into an input box and click &#8220;sendTextMessage&#8221; and the message will be stuffed into the queue right there.</p>
<p>
<div style="text-align:center;"><img src="http://blog.phatboyg.com/wp-content/uploads/2009/07/jconsoleoperations.png" alt="JConsoleOperations.png" border="0" width="640" height="495" /></div>
</p>
<p>So now that we know ActiveMQ is running and happy, we can modify our application to use the ActiveMQ transport instead of the MSMQ transport by simply changing the URI for the endpoint. So instead of <tt>msmq://localhost/mt_subscriptions</tt> you would specify <tt>activemq://192.168.0.195:61616/mt_subscriptions</tt> (in my case, that is the IPv4 address of my host machine). As long as the transport is in the same folder and you&#8217;re using the <a href="http://structuremap.sourceforge.net/Default.htm">StructureMap</a> base registry without specifying a specific transport, it should connect up to the host and start working. The other containers will hopefully get this support soon, it was just easy to add with the Scan() feature of StructureMap&#8217;s registry DSL.</p>
<p>I hope to dig deeper into the ActiveMQ transport support in MassTransit, as well as start testing it while running under Mono on OS X over the next few weeks. I already have the Windows bits working, I just want to test more exception cases such as losing the connection to ActiveMQ, as well as other runtime issues to make the code more production ready. I also want to try sending messages to/from other languages, such as <a href="http://www.ruby-lang.org/en/">Ruby</a> via <a href="http://stomp.codehaus.org/">STOMP</a>, but my Ruby skills are not the greatest.</p>
<p>At the very least, I hope this article helps you get ActiveMQ installed and running on your Mac using OS X Leopard. If you do run into issues or have problems, be sure to visit the <a href="http://groups.google.com/group/masstransit-discuss">MassTransit mailing list</a> and post your questions/issues there.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.phatboyg.com/2009/07/12/accessing-activemq-on-mac-osx-from-a-windows-vm/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>I&#8217;m a Microsoft C# MVP!</title>
		<link>http://blog.phatboyg.com/2009/07/01/im-a-microsoft-c-mvp/</link>
		<comments>http://blog.phatboyg.com/2009/07/01/im-a-microsoft-c-mvp/#comments</comments>
		<pubDate>Thu, 02 Jul 2009 00:14:00 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://blog.phatboyg.com/?p=784</guid>
		<description><![CDATA[Opening my Inbox this morning resulted in a pleasant surprise from Microsoft. I have been presented with the 2009 Microsoft&#174; MVP Award as a recognition for sharing my expertise in Visual C# with others. It is an honor to be recognized by Microsoft for doing something that I truly enjoy &#8211; building really cool software. [...]]]></description>
			<content:encoded><![CDATA[<p>Opening my Inbox this morning resulted in a pleasant surprise from Microsoft. I have been presented with the 2009 Microsoft&reg; MVP Award as a recognition for sharing my expertise in Visual C# with others. It is an honor to be recognized by Microsoft for doing something that I truly enjoy &#8211; building really cool software.</p>
<div style="text-align:center;"><img src="http://blog.phatboyg.com/wp-content/uploads/2009/07/mvpbanner.png" alt="MVPbanner.png" border="0" width="584" height="108" /></div>
<p style="text-align:center;">
<blockquote><em>Microsoft Most Valuable Professionals (MVPs) are exceptional technical community leaders from around the world who are awarded for voluntarily sharing their high quality, real world expertise in offline and online technical communities. Microsoft MVPs are a highly select group of experts that represents the technical community&#8217;s best and brightest, and they share a deep commitment to community and a willingness to help others.</em></p></blockquote>
<p>A community-based award like this would not be possible without the support of my peers, and I look forward to meeting up with some of those very peers at the next MVP Summit! In the meantime, congratulations to all the new and renewed MVPs!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.phatboyg.com/2009/07/01/im-a-microsoft-c-mvp/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>

