2012-04-18 24 views
11

Ứng dụng của tôi bao gồm ứng dụng ASP.NET MVC 3 và Dịch vụ Windows, cả trên cùng một hộp. Ứng dụng MVC sử dụng MassTransit để đặt các tin nhắn trên một hàng đợi MSMQ. Dịch vụ này sử dụng MassTransit để đọc các tin nhắn này từ MSMQ và thực hiện một số công việc. Khi tôi tải lên dịch vụ và ứng dụng và để chúng chạy đồng thời, mọi thứ dường như hoạt động tốt. Tuy nhiên, nếu tôi chỉ tải ứng dụng web, tin nhắn của tôi không được thêm vào MSMQ và về cơ bản biến mất. Điều kỳ lạ là nếu tôi tải lên ứng dụng web của tôi và sau đó bắt đầu và ngay lập tức ngừng dịch vụ cho biết, các tin nhắn tiếp theo được gửi từ ứng dụng web sẽ được thêm vào hàng đợi.Masstransit - Không có tin nhắn nào được thêm vào MSMQ khi dịch vụ nhận không được khởi động

Không có nhiều ví dụ tốt/hiện đại về việc sử dụng MassTransit với StructureMap và/hoặc MVC, vì vậy nó có thể là một vấn đề với cấu hình của tôi, nhưng sau một vài giờ dùng thử và lỗi tôi không chắc chắn làm thế nào để tiến hành . Tôi cũng có thể được lợi dụng MassTransit - thực sự những gì tôi cần là một đám cháy và quên giải pháp từ các ứng dụng web ...

dịch vụ của tôi trông như thế này:

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

ứng dụng web của tôi trông như thế này:

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

Mọi trợ giúp sẽ được đánh giá cao!

Trả lời

10

Khi bạn đang sử dụng MulticastSubscriptionClient, đăng ký của bạn là 'tạm thời' và không 'vĩnh viễn', tức là chúng được tự động hủy đăng ký khi tắt xe buýt.

Tùy chọn của bạn là a) sử dụng RabbitMQ làm phương tiện của bạn hoặc b) nếu bạn cần sử dụng MSMQ sau đó sử dụng dịch vụ đăng ký của MassTransit cho đăng ký khi chúng được lưu trữ trong cơ sở dữ liệu và tồn tại giữa các phiên bản bus.

Xem http://docs.masstransit-project.com/en/latest/overview/subscriptions.html để biết thêm chi tiết.