2012-02-28 16 views
6

Soy nuevo en la mensajería, y actualmente estoy investigando usando RabbitMQ como parte de la arquitectura de nuestro sistema para proporcionar mensajes entre diferentes servicios. Tengo un basic RabbitMQ example funcionando y puede transmitir un mensaje de texto básico sobre el bus. Parece que EasyNetQ podría ser simplemente parte de la complejidad del uso de RabbitMQ, aunque estoy teniendo un pequeño problema para hacerlo funcionar.Uso de EasyNetQ con RabbitMQ para publicar y recibir mensajes

En lugar de sólo una cadena, me gustaría enviar un mensaje más avanzado representado por la clase siguiente:

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

Estoy intentando enviar esta mediante su publicación a la cola, y luego he el suscriptor lo recoge de la cola. Mi código es el siguiente:

Editorial

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); 
} 

receptor

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))); 
} 

Ambas partes parecen conectar, y el editor informa que el mensaje fue publicado:

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

El abonado registra el siguiente:

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

Parece que el abonado es o no conectar a una cola (o la cola correcta), o hay algo más que tenga que hacer para recibir el mensaje en realidad?

Respuesta

17

Lo sentimos Mun, estoy el autor principal de EasyNetQ, acabo de ver esto. Su problema es que está desechando el autobús tan pronto como haya completado la suscripción, por lo que inmediatamente deja de escuchar tan pronto como se haya suscrito. Crea el bus cuando la aplicación se inicie, deséchalo cuando se apague. Por qué debería hacer esto se explica en los documentos aquí: https://github.com/mikehadlow/EasyNetQ/wiki/Connecting-to-RabbitMQ

Para abordar el punto de Simon. Tiene razón, EasyNetQ está diseñado intencionalmente solo para proporcionar un subconjunto de las capacidades de RabbitMQ a fin de simplificar la API. Actualmente ofrecemos dos patrones: pub/sub y request/response. Espere ver enrutamiento basado en temas pronto.

+0

Gracias Mike. Terminó creando un contenedor personalizado para atender las necesidades de nuestro proyecto, pero mantendrá a EasyNetQ atento a cualquier actualización. – Mun

2

RabbitMQ tiene un add-on de administración (http://www.rabbitmq.com/management.html) que es esencial cuando se trabaja con conejos: le mostrará los intercambios y las colas y el cliente que están conectados. Entonces debería poder ver si el receptor está conectado a la cola.

Tenga cuidado con el pedido ya que Exchange no retendrá una copia de un mensaje enviado; simplemente páselo a las colas vinculadas a él (u otros intercambios en versiones posteriores), de modo que si envías un mensaje a un intercambio y creas un receptor, lo que crea una cola temporal y enlaza esta fila al intercambio, es posible que el mensaje tenga Ya se ha procesado - RabbitMQ es muy rápido (solo pensando en voz alta)

EasyNetQ es una pieza de trabajo, pero el hecho de no tratar con los mensajes ACK puede ser un problema para algún tipo de aplicación. RabbitMQ, a diferencia de otros, es compatible con más modelos que pub/sub así que usar EasyNetQ limitará que - lo que podría ser un problema depende de su aplicación, etc.

Gracias

Simon

+0

Sí, el complemento de administración es muy útil y definitivamente esencial cuando se hace algo con RabbitMQ. – Mun

-3

También he comenzado a jugar con rabbitMQ y easynetQ, son productos fantásticos. Mike Hedlow tiene razón acerca de hacer del autobús un singleton. Creé un proyecto de muestra para reflejar esto here

El objeto MXRabbitBus en mi código está destinado a ser utilizado también en una aplicación web.

Cuestiones relacionadas