RSS feed blog search engine
 

IBlog<Johan>  
Released:  3/7/2009 5:09:16 PM  
RSS Link:  http://weblogs.asp.net/jdanforth/Rss.aspx  
Last View 2/8/2012 11:02:10 AM  
Last Refresh 2/8/2012 10:50:20 AM  
Page Views 437  
Comments:  Read user comments (0)  
Report violation Report a violation or adult content
Save It  



Description:



This and that in a developer's life in general


Contents:

How to Force Comments When Doing Check-In in TFS

I was looking for a policy like this, and found this blog article by Claus Konrad:

http://blog.clauskonrad.net/2010/08/tfs-2010-how-to-force-comments-when.html

Now, unfortunately everyone in the project has to have the TFS Power Tools installed to make this work.

The power tools can be downloaded from the Visual Studio Gallery, this is a direct link to it:

http://visualstudiogallery.msdn.microsoft.com/c255a1e4-04ba-4f68-8f4e-cd473d6b971f?SRC=VSIDE

Whish this was in the box from start.




MSTest and Calling Exe with Sample Data Files

For various reasons Im using MSTest for my unit tests and I have this console app which generates a PDF file from an XML file that needed some tests.

So, when moving the unit tests over to a TFS build server, having hard coded paths to test data files is not a good idea. The recommended way of doing it is to use the DeploymentItem attribute.

Also, when calling an exe-file which does Environment.Exit() and catching the exit code from the unit test is pretty straight forward by using Process.Start() and checking the ExitCode property.

A small sample:

[TestMethod]
[DeploymentItem(@"TestDataarbetsorder.xml", "TestData")]
[DeploymentItem(@"TestDataarbetsorderReport.rdlc", "TestData")]
public void GeneratorShouldReturnWithExitCode0()
{
    Process proc;
    try
    {
        proc = Process.Start("PdfGenerator.exe", """ + Directory.GetCurrentDirectory() + "/TestData/arbetsorderReport.rdlc" "" +
            Directory.GetCurrentDirectory() + "/arbetsorder.pdf" "" + Directory.GetCurrentDirectory() + "/TestData/arbetsorder.xml"");
    }
    catch (System.ComponentModel.Win32Exception ex)
    {
        proc = null;
        Assert.Fail(ex.Message);
    }

    Assert.IsNotNull(proc);
    proc.WaitForExit(10000);
    Assert.IsTrue(proc.HasExited);
    Assert.AreEqual(0, proc.ExitCode, "Expected 0, got " + proc.ExitCode);
}

But, theres a small caveat to get the DeploymentItem argument working properly! First you have to open up the test settings of your .testsettings file, select the Deployment settings and make sure the Enable deployment checkbox is checked:

image

Thats all you need to do. And note that you may actually have to exit and restart Visual Studio to make it work. I never got the files deployed until I did that restart.




Command Handling the Nancy Way

minibuss_small_thumb1_thumb_thumb MiniBuss is a micro service bus framework over msmq which consists of less than 400 lines of code, sitting inside one single source file. The project is hosted over at http://minibuss.codeplex.com and the source code is maintained at https://github.com/johandanforth/MiniBuss

Ive been a fan of the Sinatra inspired web framework called Nancy, especially the neat way of setting up handlers for routes. The simplest sample on their site is this:

public class Module : NancyModule
{
    public Module()
    {
        Get["/greet/{name}"] = x => {
            return string.Concat("Hello ", x.name);
        };
    }
}

So, I shamelessly dug into the Nancy code and borrowed some 20-30 lines of code and came up with something like this for registering handlers for certain incoming commands on the minibus, what do you think?

public class CommandHandler : MessageHandler
{
    public CommandHandler()
    {
        WhenReceiving[typeof(SampleMessage1)] = x =>
        {
            Console.WriteLine("sample 1 message: " + x.Text);
        };

        WhenReceiving[typeof(SampleMessage2)] = x =>
        {
            Console.WriteLine("sample 2 message: " + x.Text);
        };
    }
}

Its a bit more code but it helps/enforces you to move the handlers off to a certain module. Thoughts?




More MiniBuss Updates

minibuss_small_thumb1_thumb MiniBuss is a micro service bus framework over msmq which consists of less than 400 lines of code, sitting inside one single source file. The project is hosted over at http://minibuss.codeplex.com

Thanks to @CodingInsomnia for testing out the MiniBuss stuff a bit more than I did Winking smile For the samples, and for my initial testing code, I used a shared assembly with messages (events and commands), which shouldnt be necessary. So I made a few simple changes and now you can choose to either share messages in an assembly between your sender/receiver and publisher/subscribers OR you can declare local message classes as long as those classes use the same class name and properties it should work.

The NuGet package has been updated, and the new code is in package version 1.0.2.0.




MiniBuss Updates

minibuss_small_thumb1 I made a small update to MiniBuss, the micro service bus framework. The messages you send, Commands and Events, are no longer dependent on IMessage. The messages sent on the bus can now be any .NET class which can be safely serialized.

The MiniBuss package on NuGet has been updated (version 1.1.0.1).

Im looking for testers, reviewers and co-authors. Areas I want to look more at are multithreading/concurrency and the reply-feature (especially being able to reply to current message in multithreaded scenarios.




MiniBuss on Codeplex

minibuss_small The micro service bus framework for msmq called MiniBuss is now open source on Codeplex at http://minibuss.codeplex.com

There is also now a NuGet package available for easy install into projects:

image

If youre interested in co-op on this project, please contact me via Codeplex! Im looking for devs and tester who knows their c#, msmq and concurrency.




A One File .NET Micro Service Bus for MSMQ?

This last year our company has invested quite some time in looking at CQRS, which led to looking at great looking service-buses like nServiceBus, Rhino Service Bus and Mass Transit, which led me to do some bus-coding on my own, mostly for fun and for learning MSMQ.

Inspired by the service buses mentioned above, the result became a bare-bones-one-file micro service bus that I call MiniBuss which sits on top of MSMQ. The file itself is only some 400 lines of code and supports send, receive, reply, publish and subscribe/unsubscribe.

Setting up a sender may look something like this:

var bus = new MiniBuss.ServiceBus();

bus.RegisterMessageEndpoint<HelloCommand>("minibuss_receiver1@johan-dell-ssd");

bus.Start();

bus.Send(new HelloCommand { Guid = Guid.NewGuid(), Message = "Hello" });

Create the bus, register a message and tell it where messages of this type should go, start the bus and send the message.

Setting up a receiver may look something like this:

var bus = new ServiceBus { LocalEndpoint = "minibuss_receiver1" };

bus.RegisterMessageHandler<HelloCommand>(command => Console.WriteLine(command.Message + " Guid: " + command.Guid));

bus.Start();

Create the bus and tell it which endpoint to listen to (which creates a local MSMQ queue if necessary) and tell it which message type to listen for and which delegate to kick off when such a message is received.

Similarly, when doing a receive/reply, you would have to create the bus on the sender side with a local endpoint and register a message-handler for replies, like this:

var bus = new MiniBuss.ServiceBus { LocalEndpoint = "minibuss_sender1" };

bus.RegisterMessageEndpoint<HelloCommand>("minibuss_receiver1@johan-dell-ssd");

bus.RegisterMessageHandler<HelloResponse>(reply => Console.WriteLine("Reply from receiver: " + reply.Message));

bus.Start();

Console.WriteLine("Sending command...");
bus.Send(new HelloCommand { Guid = Guid.NewGuid(), Message = "Hello" });

The receiver would do a bus.reply() like this:

var bus = new ServiceBus { LocalEndpoint = "minibuss_receiver1" };

bus.RegisterMessageHandler<HelloCommand>(command =>
{
Console.WriteLine(command.Message + " Guid: " + command.Guid);

bus.Reply(new HelloResponse { Guid = Guid.NewGuid(), Message = "Hello back!" });
});

bus.Start();

The MiniBus also supports publish to multiple subscribers. A simple publisher would create a bus with a local endpoint (to receive subscribe/unsubscribe commands), tell it to handle subscriptions for a certain event, then start publishing something every 5 seconds (as an example):

var bus = new MiniBuss.ServiceBus { LocalEndpoint = "minibuss_publisher1" };

bus.HandleSubscriptionsFor<SomethingHappenedEvent>();

bus.Start();

Task.Factory.StartNew(() => PublishingThread(bus), TaskCreationOptions.LongRunning);

Console.WriteLine("Done, press ENTER to exit");
Console.ReadLine();
private static void PublishingThread(MiniBuss.ServiceBus bus)
{
while (true)
{
Thread.Sleep(5000);
var guid = Guid.NewGuid();
Console.WriteLine("Publishing event with guid " + guid);
bus.Publish(new SomethingHappenedEvent() { Guid = guid, Sent = DateTime.Now });
}
}

Any clients interesting in subscribing to events from the publisher would create a bus with a local endpoint, start the bus and then send a subscribe command to the publisher, telling it youre interested in subscribing to a certain type of event and which delegate to handle it:

var bus = new MiniBuss.ServiceBus {LocalEndpoint = "minibuss_subscriber1"};

bus.Start();

bus.Subscribe<SomethingHappenedEvent>("minibuss_publisher1@localhost",
@event => Console.WriteLine("something happened at {0}, event id {1}",
@event.Sent, @event.Guid));

Console.WriteLine("Waiting for events, press ENTER to exit");
Console.ReadLine();

bus.UnSubscribe<SomethingHappenedEvent>("minibuss_publisher1");

Now, the question is, what do you think? I know there are issues with the code, like how to make message-handlers multi-threaded/concurrent without messing things up (its single threaded right now), and how to best handle exceptions, rollbacks and re-tries . Right now handling exceptions in send and receive works pretty well within a TransactionScope() together with ADO.NET, and if theres an exception, the message is moved the an error-queue. No re-try or anything, only rollback and move to xxx_error. Also, the publisher doesnt persist subscriptions, so if it is restarted subscribers wouldnt know. You know, things like that.

Im a user of the micro-orm called Dapper and like it a lot, so Im thinking that maybe I should release this micro-bus as open source and see where people may take it, if anywhere? Maybe just down the drain because they figure out this service bus is dangerous to use and risk loosing messages or something (which would be extremely good to know :)



Home  
 
 




Privacy Policy