2012-04-18 17 views
11

Mi aplicación consiste en una aplicación ASP.NET MVC 3 y un servicio de Windows, ambos en el mismo cuadro. La aplicación MVC usa MassTransit para colocar mensajes en una cola de MSMQ. El servicio usa MassTransit para leer estos mensajes de MSMQ y realizar algún trabajo. Cuando cargo el servicio y la aplicación y los ejecuto simultáneamente, todo parece funcionar bien. Sin embargo, si solo cargo la aplicación web, mis mensajes no se agregan a MSMQ y desaparecen. Lo curioso es que si cargo mi aplicación web y luego comienzo e inmediatamente detengo dicho servicio, los mensajes posteriores enviados desde la aplicación web se agregan a la cola.Masstransit: no se agregaron mensajes a MSMQ cuando el servicio del receptor no se inició

No había muchos buenos/modernos ejemplos de uso de MassTransit con StructureMap y/o MVC, por lo que podría ser un problema con mi configuración, pero después de un par de horas de prueba y error no estoy seguro de cómo proceder . Estoy también esté haciendo mal uso de MassTransit - en realidad lo que necesito es un fuego y olvido solución a partir de la aplicación web ...

Mi servicio es el siguiente:

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

Mi aplicación web es el siguiente:

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

¡Cualquier ayuda sería apreciada!

Respuesta

10

Como está utilizando el MulticastSubscriptionClient, sus suscripciones son 'transitorias' y no 'permanentes', es decir, se anulan automáticamente en el cierre del bus.

Sus opciones son a) utilizar RabbitMQ como su transporte ob) si necesita utilizar MSMQ luego utilizar SubscriptionServices de MassTransit para suscripciones, ya que se almacenan en una base de datos y persisten entre instancias de bus.

Consulte http://docs.masstransit-project.com/en/latest/overview/subscriptions.html para obtener más información.

Cuestiones relacionadas