Masstransit - сообщения не добавляются в MSMQ, если служба получателя не запущена.

Мое приложение состоит из приложения ASP.NET MVC 3 и службы Windows, находящихся в одном устройстве. Приложение MVC использует MassTransit для помещения сообщений в очередь MSMQ. Сервис использует MassTransit для чтения этих сообщений из MSMQ и выполнения некоторой работы. Когда я загружаю службу и приложение и запускаю их одновременно, все вроде работает нормально. Однако, если я загружаю только веб-приложение, мои сообщения не добавляются в MSMQ и практически исчезают. Странно то, что если я загружаю свое веб-приложение, а затем запускаю и немедленно останавливаю указанную службу, последующие сообщения, отправленные из веб-приложения, добавляются в очередь.

Было не так много хороших / современных примеров использования MassTransit с StructureMap и / или MVC, поэтому это могло быть проблемой с моей конфигурацией, но после пары часов проб и ошибок я не знаю, как действовать дальше. Я также могу неправильно использовать MassTransit - на самом деле мне нужно решение "огонь и забыть" из веб-приложения ...

Моя служба выглядит так:

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

Мое веб-приложение выглядит так:

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

Любая помощь будет оценена по достоинству!


person JP.    schedule 18.04.2012    source источник


Ответы (1)


Поскольку вы используете MulticastSubscriptionClient, ваши подписки являются «временными», а не «постоянными», т.е. они автоматически отменяются при отключении шины.

У вас есть следующие варианты: а) использовать RabbitMQ в качестве транспортного средства или б) если вам нужно использовать MSMQ, тогда используйте службы подписки MassTransit для подписок, как они есть. затем сохраняются в базе данных и сохраняются между экземплярами шины.

См. http://docs.masstransit-project.com/en/latest/overview/subscriptions.html для получения более подробной информации.

person stuartd    schedule 24.04.2012