2012-04-18 60 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