我的应用程序由一个ASP.NET MVC 3应用程序和一个Windows Service组成,它们都在同一盒子上。 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>()); });
        }));
    }
}

任何帮助,将不胜感激!

最佳答案

当您使用MulticastSubscriptionClient时,您的订阅是“暂时的”而不是“永久的”,即,它们在总线关闭时自动取消订阅。

您的选择是:a)使用RabbitMQ作为传输工具,或b)如果您需要使用MSMQ,然后使用MassTransit的SubscriptionServices进行预订,因为它们随后存储在数据库中并在总线实例之间保持不变。

有关更多详细信息,请参见http://docs.masstransit-project.com/en/latest/overview/subscriptions.html

关于Masstransit-未启动接收器服务时,没有消息添加到MSMQ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10201490/

10-10 16:58