2012-04-18 55 views
11

我的應用程序由ASP.NET MVC 3應用程序和Windows Service組成,它們都位於同一個框中。 MVC應用程序使用MassTransit將消息放置在MSMQ隊列中。該服務使用MassTransit從MSMQ讀取這些消息並執行一些工作。當我加載服務和應用程序並讓它們同時運行時,一切似乎都正常。但是,如果我只加載Web應用程序,我的消息不會被添加到MSMQ並基本上消失。奇怪的是,如果我加載我的Web應用程序,然後啓動並立即停止所述服務,則從Web應用程序發送的後續消息將被添加到隊列中。Masstransit - 未啓動接收器服務時未向MSMQ添加消息

沒有很多好的/現代的使用MassTransit和StructureMap和/或MVC的例子,所以它可能是我的配置問題,但經過幾個小時的反覆試驗後,我不知道如何繼續。我也可能會濫用MassTransit - 真的是我需要的是一個火,忘記從Web應用解決方案......

我的服務是這樣的:

class Program 
{ 
    static void Main(string[] args) 
    { 
     Bus.Initialize(sbc => 
     { 
      sbc.UseMsmq(); 
      sbc.VerifyMsmqConfiguration(); 
      sbc.UseMulticastSubscriptionClient(); 
      sbc.ReceiveFrom("msmq://localhost/receiver"); 
     }); 

     ObjectFactory.Initialize(x => 
     { 
      x.AddRegistry(new EmailSenderRegistry()); 
     }); 

     var host = HostFactory.New(c => 
     { 
      c.SetServiceName("MyApp.EmailMessageReader"); 
      c.SetDisplayName("MyApp.EmailMessageReader"); 
      c.SetDescription("MyApp.EmailMessageReader"); 

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

     host.Run(); 
    } 
} 

internal class ClientService 
{ 
    public void Start() 
    { 
     Bus.Instance.SubscribeConsumer<EmailPrepService>(); 
    } 

    public void Stop() 
    { 
     // do nothing 
    } 
} 

public class EmailPrepService : Consumes<EmailMessage>.All 
{ 
    public void Consume(EmailMessage message) 
    { 
     PrepareEmailForSending(message); 
     var emailService = ObjectFactory.GetInstance<IEmailSender>(); 
     emailService.SendEmail(message); 
    } 
} 

我的web應用程序是這樣的:

public class BusRegistry : Registry 
{ 
    public BusRegistry() 
    { 
     For<IServiceBus>().Singleton().Use(context => ServiceBusFactory.New(sbc => 
     { 
      sbc.ReceiveFrom("msmq://localhost/sender");    
      sbc.UseMsmq(); 
      sbc.UseMulticastSubscriptionClient(); 
      sbc.UseControlBus(); 
      sbc.Subscribe(subs => { subs.LoadFrom(context.GetInstance<IContainer>()); }); 
     }));    
    } 
} 

任何幫助,將不勝感激!

回答

10

當您使用MulticastSubscriptionClient時,您的訂閱是'瞬態',而不是'永久',即它們在總線關閉時自動取消訂閱。

您的選擇是:a)使用RabbitMQ作爲您的交通工具或b)如果您需要使用MSMQ,則使用MassTransit的SubscriptionServices進行訂閱,然後將它們存儲在數據庫中並在總線實例之間保留。

有關更多詳細信息,請參見http://docs.masstransit-project.com/en/latest/overview/subscriptions.html