2013-03-18 3 views
9

Ich versuche, meinen Kopf um Masstransit und RabbitMQ und Queuing (Tag 1)Newbie - Ist eine Consumer Queue notwendig, um für die Veröffentlichung in Masstransit zu arbeiten

Die Frage, die ich zu bekommen habe, ob ein „Consumer notwendig damit ich in der Warteschlange in MT arbeiten kann. Der Grund, warum ich frage, ist, dass ich zuerst Domain und Producer erstellt habe, aber im Warteschlangen-Management-Fenster habe ich keine Warteschlangen gefunden. "

Wenn die Consumer Queue erstellt wird, kann ich die Nachricht in der Warteschlange sehen.

Basierend auf meinem Verständnis, Produzent ist nie bewusst, Verbraucher, also warum MassTransit Verbraucher-Warteschlange erforderlich, um die Veröffentlichung von Nachrichten zu starten?

Der Produzent

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

Die Anwendung

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

Die Nachricht

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

Th e Consumer Service

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

Code wurde anhand von Beispielen auf Web erstellt.

bearbeiten möchte hinzufügen, auch, dass alle Namensräume verschiedene Projekte Domain Producer Consumer

Grüße,

Mar

+0

Ich fand nur, dass es eine Google-Gruppe ist und die Antwort auf meine Frage ist, in einem der dort gestellten Fragen. https://groups.google.com/forum/?fromgroups=#!searchin/masstransit-discuss/publishing$20message$20without$20subscriber/masstransit-discuss/RU2_443iak8/OfILeKbfGNQJ – TheMar

+0

Ich werde diese Frage heute als geschlossen markieren, so dass die Link oben zu Google Group ist immer noch sichtbar – TheMar

Antwort

7

folgende Antworten auf Masstransit-Diskus hat mir wirklich geholfen sind.

Von Google-Gruppe Masstransit-discuss

... Die Sache mit Masstransit ist, dass Sie in eine Warteschlange nicht wirklich veröffentlichen, Sie zu einem Austausch veröffentlichen, die dann eingerichtet ist, dass die Nachricht weiterzugeben zu anderen Warteschlangen, die Nachrichten an diesem Austausch abonniert haben. Da Sie keine Verbraucher haben, hat niemand Interesse an Ihrer Nachricht, so dass es einfach ignoriert wird.

Richten Sie einfach einen Verbraucher ein und lassen Sie ihn anhören "rabbitmq: // localhost/B". Zum ersten Mal Sie es ausführen, wird es die notwendigen Austausch und die Verbindungen zwischen ihnen zu erstellen, wird Ihre Nachricht an eine Warteschlange mit dem Namen B.

Anders

Ein Bus weitergegeben werden ist die Sammlung aller Börsen, Warteschlangen und Dienste alle zusammen. Wenn Sie in einem Bus veröffentlichen, erhalten alle Verbraucher, die an diesem Bus registriert sind, diese.

Austausch sind die RabbitMQ-Implementierung dieser Arbeit.

Travis

+0

Link zu dieser bestimmten Google Group Diskussion (was sehr hilfreich ist!): https://groups.google.com/forum/#!topic/masstransit-discuss/6cegDxuSZpw –

Verwandte Themen