2012-04-18 2 views
11

Meine Anwendung besteht aus einer ASP.NET MVC 3-Anwendung und einem Windows-Dienst, beide auf derselben Box. Die MVC-Anwendung verwendet MassTransit zum Platzieren von Nachrichten in einer MSMQ-Warteschlange. Der Dienst verwendet MassTransit, um diese Nachrichten von MSMQ zu lesen und einige Aufgaben auszuführen. Wenn ich den Dienst und die Anwendung lade und sie gleichzeitig laufen lasse, scheint alles in Ordnung zu sein. Wenn ich jedoch nur die Webanwendung lade, werden meine Nachrichten nicht zu MSMQ hinzugefügt und verschwinden im Wesentlichen. Die seltsame Sache ist, dass, wenn ich meine Webanwendung hochlade und dann den Dienst starte und sofort stoppe, nachfolgende Nachrichten, die von der Webanwendung gesendet werden, zu der Warteschlange hinzugefügt werden.Masstransit - Keine MSMQ-Nachrichten hinzugefügt, wenn der Empfängerdienst nicht gestartet wurde

Es gab nicht viele gute/moderne Beispiele für die Verwendung von MassTransit mit StructureMap und/oder MVC, also könnte es ein Problem mit meiner Konfiguration sein, aber nach ein paar Stunden Versuch und Irrtum bin ich nicht sicher, wie es weiter geht . Ich kann auch Masstransit missbrauchen - wirklich das, was ich brauche, ist ein Feuer und vergessen Lösung aus der Web-Anwendung ...

Mein Service sieht wie folgt aus:

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

Meine Web-Anwendung sieht wie folgt aus:

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

Jede Hilfe wäre willkommen!

Antwort

10

Da Sie den MulticastSubscriptionClient verwenden, sind Ihre Abonnements "vorübergehend" und nicht "permanent", d. H. Sie werden beim Beenden des Busses automatisch abgemeldet.

Ihre Optionen sind a) Verwenden Sie RabbitMQ als Ihr Transport oder b) wenn Sie MSMQ verwenden müssen, verwenden Sie dann SubscriptionServices von MassTransit für Subskriptionen, da sie dann in einer Datenbank gespeichert werden und zwischen Businstanzen persistieren.

Weitere Informationen finden Sie unter http://docs.masstransit-project.com/en/latest/overview/subscriptions.html.