2012-04-18 24 views
11

मेरे एप्लिकेशन में एक ही बॉक्स पर एक एएसपी.नेट एमवीसी 3 एप्लिकेशन और एक विंडोज सेवा शामिल है। एमवीसी अनुप्रयोग एमएसएमक्यू कतार पर संदेश रखने के लिए MassTransit का उपयोग करता है। एमएसएमक्यू से इन संदेशों को पढ़ने और कुछ काम करने के लिए सेवा MassTransit का उपयोग करती है। जब मैं सेवा और एप्लिकेशन को लोड करता हूं और उन्हें एक साथ चल रहा हूं, तो सबकुछ ठीक काम करता प्रतीत होता है। हालांकि, अगर मैं केवल वेब एप्लिकेशन लोड करता हूं, तो मेरे संदेश एमएसएमक्यू में नहीं जोड़े जा रहे हैं और अनिवार्य रूप से गायब हो गए हैं। अजीब चीज यह है कि अगर मैं अपना वेब एप्लिकेशन लोड करता हूं और फिर सेवा शुरू करता हूं और तुरंत बंद करता हूं, तो वेब ऐप से भेजे गए बाद के संदेश कतार में जोड़े जाते हैं।मासस्ट्रांसिट - एमएसएमक्यू में कोई संदेश नहीं जोड़ा गया जब रिसीवर सेवा शुरू नहीं हुई

स्ट्रक्चर मैप और/या एमवीसी के साथ मासट्रांसिट का उपयोग करने के कई अच्छे/आधुनिक उदाहरण नहीं थे, इसलिए यह मेरी कॉन्फ़िगरेशन में समस्या हो सकती है, लेकिन परीक्षण और त्रुटि के कुछ घंटों के बाद मुझे यकीन नहीं है कि कैसे आगे बढ़ना है । मैं भी 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>()); }); 
     }));    
    } 
} 

किसी भी मदद की सराहना की होगी!

उत्तर

10

जैसा कि आप मल्टीकास्टस्क्रिप्शन क्लाइंट का उपयोग कर रहे हैं, आपकी सदस्यता 'क्षणिक' है और 'स्थायी' नहीं है, यानी वे बस शटडाउन पर स्वचालित रूप से सदस्यता समाप्त कर दी गई हैं।

आपके विकल्प ए) हैं RabbitMQ अपने परिवहन के रूप में या बी) यदि आपको एमएसएमक्यू का उपयोग करने की आवश्यकता है तो सदस्यता के लिए MassTransit की सदस्यता सेवा का उपयोग करें क्योंकि उन्हें डेटाबेस में संग्रहीत किया जाता है और बस उदाहरणों के बीच जारी रहता है।

अधिक जानकारी के लिए http://docs.masstransit-project.com/en/latest/overview/subscriptions.html देखें।

संबंधित मुद्दे