2013-03-18 5 views
9

を動作させるために必要な消費者のキューである私はMassTransitとRabbitMQのまわりで私の頭を取得しようとキューイングしています(1日目)初心者 - 出版がMassTransit

私が持っている疑問は、「消費者が必要であるかどうかであります私が最初にDomainとProducerを作ったが、私はRabbitMQ管理ウィンドウで待ち行列に入ったアイテムを見なかったからです。

コンシューマキューが作成されると、メッセージがキューに入れられます。

私の理解に基づいて、Producerはコンシューマーを意識していないため、なぜ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 eコンシューマサービス

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

コードはwebの例を使用して作成されました。

編集はまた、すべての名前空間が異なるプロジェクトであることを追加したいと思います ドメイン プロデューサー 消費者

よろしく、

+0

私はちょうどそこに、Googleのグループがあると私の質問への答えが質問の一つであることがわかりました。 https://groups.google.com/forum/?fromgroups=#!searchin/masstransit-discuss/publishing$20message$20without$20subscriber/masstransit-discuss/RU2_443iak8/OfILeKbfGNQJ – TheMar

+0

私はこの質問を今日閉会とマークし、 Googleグループへのリンクは引き続き表示されます – TheMar

答えて

7

masstransit、円盤投げで次の答えは本当に私を助けました。

Googleグループから

をmasstransit-議論... MassTransitのあるものは、あなたが実際にキューに公開していないことを、あなたはその後にそのメッセージを渡すように設定されている為替に公開されますその交換機のメッセージを購読している他のキューに送信する。あなたは消費者がいないので、誰もあなたのメッセージに関心を示していないので、単に無視されます。

単純にコンシューマーを設定し、 "rabbitmq:// localhost/B"を聞くようにしてください。あなたはそれを初めて実行するには、それは、それらの間に必要な交流やリンクを作成し、あなたのメッセージは、すべての取引所の集合であるB.

アンダース

バスをという名前のキューに渡されますキュー、およびサービスをすべて一緒に使用できます。バスに公開すると、そのバスに登録されているすべてのコンシューマーがそれを受信します。

交換は、この作業を行うRabbitMQの実装です。

トラヴィス

+0

このGoogleグループディスカッションにリンクしてください(非常に役に立ちます):https://groups.google.com/forum/#!topic/masstransit-discuss/6cegDxuSZpw –