Использование EasyNetQ с RabbitMQ для публикации и получения сообщений - PullRequest
7 голосов
/ 28 февраля 2012

Я новичок в области обмена сообщениями, и в настоящее время изучаю использование 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 ]

17 голосов
/ 24 апреля 2012

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

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

2 голосов
/ 28 февраля 2012

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

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

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

Спасибо

Simon

0 голосов
/ 28 февраля 2014

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

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

...