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!