Использование EasyNetQ с RabbitMQ для публикации и получения сообщений

Я новичок в обмене сообщениями и в настоящее время исследую использование RabbitMQ как часть нашей архитектуры системы для обеспечения обмена сообщениями между различными службами. У меня есть базовый пример RabbitMQ работающ и оно может передать основное текстовое сообщение над шиной. Похоже на EasyNetQ может просто некоторая сложность использования RabbitMQ, хотя у меня возникли некоторые проблемы с его работой.

вместо того, чтобы просто строка, я хотел бы отправьте более продвинутое сообщение, представленное следующим классом:

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

Я пытаюсь отправить это, опубликовав его в очереди, а затем абонент забрать его из очереди. Мой код выглядит следующим образом:

издатель

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

приемник

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

кажется, что обе стороны соединяются, и издатель сообщает, что сообщение было опубликовано:

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

абонент регистрирует следующий:

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

похоже, что подписчик либо не подключается к очереди (или правильной очереди), либо есть что-то еще, что мне нужно сделать, чтобы фактически получить сообщение?

3 ответов


извините Мун, я главный автор EasyNetQ, я только что видел это. Ваша проблема в том, что вы избавляетесь от автобуса, как только вы сделали подписку, поэтому вы немедленно перестаете слушать, как только вы подписались. Создайте шину при запуске приложения, утилизируйте ее при завершении работы. Почему вы должны это сделать, объясняется в документах здесь:https://github.com/mikehadlow/EasyNetQ/wiki/Connecting-to-RabbitMQ

чтобы обратиться к точке Саймона. Он прав, EasyNetQ специально разработан, чтобы предоставить только подмножество возможностей RabbitMQ для упрощения API. В настоящее время мы предоставляем два шаблона: pub/sub и request/response. Ожидайте увидеть маршрутизацию на основе темы в ближайшее время.


RabbitMQ имеет надстройку управления (http://www.rabbitmq.com/management.html ) что важно при работе с rabbit: он покажет вам обмены и очереди и клиента, которые подключены. Таким образом, Вы сможете увидеть, подключен ли получатель к очереди.

будьте осторожны с заказом, так как обмен не будет содержать копию сообщения, отправленного ему; просто передайте его в связанные с ним очереди (или другие обмены в более поздних версиях), поэтому, если вы отправляете сообщение обмен и создание получателя-который создает временную очередь и связывает эту очередь с обменом-его возможное сообщение уже обработано-RabbitMQ очень быстро (просто думая вслух)

EasyNetQ-это часть работы, но не иметь дело с сообщениями ACK может быть проблемой для некоторых типов приложений. RabbitMQ, в отличие от других, поддерживает больше моделей, чем pub/sub, поэтому использование EasyNetQ ограничит вас - что может быть проблемой, зависит от вашего приложения так далее.

спасибо

Симон


Я также начал играть с rabbitMQ и easynetQ, они фантастические продукты. Майк Hedlow правильно о том, чтобы автобус синглтон. Я создал образец проекта здесь

объект MXRabbitBus в моем коде также предназначен для использования в веб-приложении.