2013-03-18 2 views
9

내가 MassTransit 및 RabbitMQ 주위에 내 머리를 얻으려고 노력하고 대기하고 작동하기 위해서는 (1 일)신참 - 출판 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; } 
    } 
} 

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

코드는 웹상의 예를 사용하여 작성되었습니다.

편집 또한 모든 네임 스페이스가 다른 프로젝트 도메인 생산자 소비자

감사합니다,

+0

난 그냥 거기에 구글 그룹 내 질문에 대한 답이 묻는 질문 중 하나에 있음을 발견했다. 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 –