Using EasyNetQ with RabbitMQ to publish and receive messages

Mun picture Mun · Feb 28, 2012 · Viewed 9k times · Source

I'm new to messaging, and currently investigating using RabbitMQ as part of our system architecture to provide messaging between different services. I've got a basic RabbitMQ example working and it can transmit a basic text message over the bus. It looks like EasyNetQ could simply some of the complexity of using RabbitMQ, though I'm having a little trouble getting it working.

Instead of just a string, I'd like to send a more advanced message represented by the following class:

public class Message
{
    public string Text { get; set; }
    public int RandomNumber { get; set; }
    public DateTime Date { get; set; }
}

I'm trying to send this by publishing it to the queue, and then have the subscriber pick it up off the queue. My code is as follows:

Publisher

using (var bus = RabbitHutch.CreateBus("host=localhost"))
{
    var message = new Message() { Text = "Hello World", RandomNumber = new Random().Next(1,100), Date = DateTime.Now };
    bus.Publish<Message>(message);
}

Receiver

using (var bus = RabbitHutch.CreateBus("host=localhost"))
{
    bus.Subscribe<Message>("test", m => Console.WriteLine(string.Format("Text: {0}, RandomNumber: {1}, Date: {2}", m.Text, m.RandomNumber, m.Date)));
}

Both sides seem to connect, and the publisher reports that the message was published:

DEBUG: Trying to connect
INFO: Connected to RabbitMQ. Broker: 'localhost', VHost: '/'
DEBUG: Published UserQuery+Message:query_lzzfst, CorrelationId ec81fc89-4d60-4a8b-8ba2-7a6d0818d2ed

The subscriber logs the following:

DEBUG: Trying to connect
INFO: Connected to RabbitMQ. Broker: 'localhost', VHost: '/'

It looks like the subscriber is either not connecting to a queue (or the correct queue), or there is something else I need to do to actually receive the message?

Answer

Mike Hadlow picture Mike Hadlow · Apr 24, 2012

Sorry Mun, I'm the main author of EasyNetQ, I've only just seen this. Your problem is that you are disposing of the bus as soon as you've done the subscription, so you immediately stop listening as soon as you've subscribed. Create the bus when your app starts up, dispose it when it shuts down. Why you should do this is explained in the docs here: https://github.com/mikehadlow/EasyNetQ/wiki/Connecting-to-RabbitMQ

To address Simon's point. He is right, EasyNetQ is intentionally designed to only provide a subset of RabbitMQ's capabilities in order to simplify the API. We currently provide two patterns: pub/sub and request/response. Expect to see topic based routing soon.