11

私のアプリケーションは、同じボックスにある 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>()); });
        }));            
    }
}

どんな助けでも大歓迎です!

4

1 に答える 1

10

MulticastSubscriptionClient を使用しているため、サブスクリプションは「一時的」であり、「永続的」ではありません。つまり、バスのシャットダウン時に自動的にサブスクライブ解除されます。

オプションは、 a) トランスポートとしてRabbitMQを使用するか、b) MSMQ を使用する必要がある場合は、サブスクリプションに MassTransit の SubscriptionServices を使用します。サブスクリプションはデータベースに格納され、バス インスタンス間で永続化されます。

詳細については、 http://docs.masstransit-project.com/en/latest/overview/subscriptions.htmlを参照してください。

于 2012-04-24T15:45:18.560 に答える