2013-03-18 1 views
9

Я пытаюсь получить мою голову вокруг MassTransit и RabbitMQ и массового обслуживания (день 1)Новичок - это потребитель Queue необходимо для того, чтобы Издательское работать в MassTransit

У меня есть вопрос, является ли «Потребитель необходимо для того, чтобы очередь работала в MT. Причина, о которой я спрашиваю, заключается в том, что я сначала создал Domain и Producer, но я не видел в очереди управления RabbitMQ в очереди. "

Когда создается очередь пользователей, я вижу, что сообщение находится в очереди.

Основываясь на моем понимании, Производитель никогда не осведомлен о потребителе, так почему MassTransit потребовал, чтобы потребительская очередь начала публикации сообщений?

Продюсер

using MassTransit; 

namespace Producer 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Bus.Initialize(sbc => 
      { 
       sbc.UseRabbitMq();   //1 
       sbc.UseControlBus(); 
       sbc.EnableMessageTracing(); 
       sbc.EnableRemoteIntrospection(); 
       sbc.ReceiveFrom("rabbitmq://localhost/MT.Producer"); 
       sbc.UseControlBus(); 
      }); 

      Bus.Instance.Publish(new NewOrderMessage { OrderName = "Hello World" }); 
     } 
    } 
} 

Применение

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using MassTransit; 
using Topshelf; 

namespace Consumer 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Bus.Initialize(sbc => 
      { 
       sbc.UseRabbitMq(); 
       sbc.UseRabbitMqRouting(); 
       sbc.ReceiveFrom("rabbitmq://localhost/MT.ConsumerService"); 
      }); 

      var cfg = HostFactory.New(c => 
      { 
       c.SetServiceName("MT.ConsumerService"); 
       c.SetDisplayName("MT.ConsumerService"); 
       c.SetDescription("MT.ConsumerService"); 

       //c.BeforeStartingServices(s => {}); 

       c.Service<ConsumerService>(a => 
       { 
        a.ConstructUsing(service => new ConsumerService()); 
        a.WhenStarted(o => o.Start()); 
        a.WhenStopped(o => o.Stop()); 
       }); 

      }); 

      try 
      { 
       cfg.Run(); 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine(e.Message); 
       throw; 
      } 
     } 
    } 
} 

Послание

namespace Domain 
{ 
    public class NewOrderMessage 
    { 
     public NewOrderMessage() 
     { 
      OrderId = Guid.NewGuid(); 
     } 
     public Guid OrderId { get; set; } 
     public string OrderName { get; set; } 
    } 
} 

Th е бытовое обслуживание

namespace Consumer 
{ 
    class ConsumerService 
    { 
     readonly IServiceBus _bus; 

     public ConsumerService() 
     { 
      _bus = Bus.Instance; 
     } 

     public void Start() 
     { 
      _bus.SubscribeHandler<NewOrderMessage>(CreateOrder); 

      Console.WriteLine("Starting...."); 
     } 

     public void Stop() 
     {  
      Console.WriteLine("Stopping...."); 
     } 

     public void CreateOrder(NewOrderMessage command) 
     { 
      Console.WriteLine("Creating Order: {0} with Id: {1}", command.OrderName, command.OrderId); 
     } 
    } 
} 

код был создан с использованием примеров на Интернете.

Редактировать хотел бы также добавить, что все пространства имен различных проектов Domain Производитель Consumer

С уважением,

Mar

+0

Я просто нашел, что есть группа Google и ответ на мой вопрос в одном из вопросов, которые задают там. https://groups.google.com/forum/?fromgroups=#!searchin/masstransit-discuss/publishing$20message$20without$20subscriber/masstransit-discuss/RU2_443iak8/OfILeKbfGNQJ – TheMar

+0

Я помету этот вопрос как закрытый сегодня, чтобы ссылка выше на google group по-прежнему отображается – TheMar

ответ

7

следующие ответы на masstransit-метании действительно помогли мне.

из группы Google masstransit-обсуждение

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

Так просто настройте потребителя и послушайте его «rabbitmq: // localhost/B». Первый раз, когда вы запустите ее, она будет создавать необходимые контакты и связи между ними, и ваше сообщение будет передано в очередь с именем Б.

Андерс

Шина является совокупность всех обменов, очередей и сервисов. Когда вы публикуете на автобусе, все потребители, зарегистрированные на этой шине, получат его.

Обмен информацией - это реализация RabbitMQ для выполнения этой работы.

Travis

+0

Ссылка на это обсуждение в Google Group (что очень полезно!): https://groups.google.com/forum/#!topic/masstransit-discuss/6cegDxuSZpw –