私のアプリケーションは、同じボックスにある ASP.NET MVC 3 アプリケーションと Windows サービスで構成されています。MVC アプリケーションは MassTransit を使用して、MSMQ キューにメッセージを配置します。このサービスは MassTransit を使用して、MSMQ からこれらのメッセージを読み取り、いくつかの作業を実行します。サービスとアプリケーションをロードして同時に実行すると、すべて正常に動作するように見えます。ただし、Web アプリケーションのみをロードすると、メッセージが MSMQ に追加されず、本質的に消えてしまいます。奇妙なことに、Web アプリケーションをロードしてからサービスを開始してすぐに停止すると、Web アプリケーションから送信された後続のメッセージがキューに追加されます。
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>()); });
}));
}
}
どんな助けでも大歓迎です!