2013-09-16 12 views
6

पर बिल्कुल 3 मिनट तक देरी से आते हैं मुझे एक बेहद परेशानी का सामना करना पड़ रहा है। मेरे पास एक विंडोज सेवा है जो इनपुट के लिए दो एमएसएमक्यू कतारों पर नज़र रखती है और किसी अन्य एमएसएमक्यू कतार में संदेश भेजती है। यद्यपि प्रेषण ऑपरेशन सेवा के परिप्रेक्ष्य से तत्काल प्रतीत होता है, लेकिन वास्तव में यह संदेश वास्तव में तीन (3) मिनट तक पहुंच जाता है (जैसा कि एमएसएमक्यू एमएमसी में गुण विंडो में दिखाया गया है)। मैं इस समस्या का परीक्षण कर रहा हूं और दूसरी तरफ कुछ भी नहीं सुन रहा हूं ताकि मैं संदेशों को पिलिंग कर सकूं। इस प्रकार सेवा संदेश भेजती है:एमएसएमक्यू संदेश हमेशा एक ही मशीन

var proxyFactory = new ChannelFactory<IOtherServerInterface>(new NetMsmqBinding(NetMsmqSecurityMode.None) 
{ 
    Durable = true, 
    TimeToLive = new TimeSpan(1, 0, 0), 
    ReceiveTimeout = TimeSpan.MaxValue 
}); 

IOtherServerInterface server = this.proxyFactory.CreateChannel(new EndpointAddress("net.msmq://localhost/private/myqueue")); 

var task = new MyTask() { ... }; 
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required)) 
{ 
    server.QueueFile(task); 
    scope.Complete(); 
} 

सेवा Windows Server 2008 R2 पर चल रही है। मैंने इसे आर 1 पर भी परीक्षण किया और उसी व्यवहार को देखा। फिर, सब कुछ एक ही मशीन पर होता है। सभी घटकों को तैनात किया जाता है इसलिए मुझे नहीं लगता कि यह नेटवर्क समस्या हो सकती है।

संपादित करें # 1:

मैं WCF निदान चालू है और क्या मैंने देखा बहुत ही अजीब है। एमएसएमक्यू डाटाग्राम सामान्य रूप से लिखा जाता है। हालांकि, "एक संदेश बंद था" ट्रेस संदेश के बाद कुछ भी नहीं चल रहा है। ऐसा लगता है कि सेवा कुछ होने की प्रतीक्षा कर रही है। वास्तव में 3 मिनट बाद और जब एमएसएमक्यू संदेश आता है (एमएसएमक्यू एमएमसी के मुताबिक), तो मुझे पिछली गतिविधि के बारे में एक और निशान संदेश दिखाई देता है। मुझे संदेह है कि कुछ प्रकार की हस्तक्षेप है।

मुझे आपको सेवाओं के काम के बारे में अधिक जानकारी देने दें। एक आईआईएस ऐप है जो ग्राहकों से कार्यों को प्राप्त करता है और उन्हें एमएसएमक्यू कतार में छोड़ देता है। वहां से, परेशानी सेवा (मुख्य सेवा) उन्हें उठाती है और उन्हें प्रसंस्करण शुरू कर देती है। कुछ मामलों में, कार्य को पूरा करने के लिए एक और सेवा (AuxService) की आवश्यकता होती है ताकि मेनस सर्विस AuxService को एक संदेश भेजता है (जो हमेशा देरी हो जाती है)। AuxService की अपनी इनबॉक्स कतार है जहां इसे एमएसएमक्यू संदेश प्राप्त होते हैं और जब यह किया जाता है, तो यह मुख्य सेवा में एक एमएसएमक्यू संदेश भेजता है। इस बीच, थ्रेड जो संदेश को AuxService को भेजता है, तब तक प्रतीक्षा करता है जब तक कि यह संकेत न हो या जब तक कि यह समय समाप्त न हो जाए। एक विशेष कतार है जहां मेनस सर्विस AuxServices से संदेशों की तलाश करता है। जब कोई संदेश प्राप्त होता है तो उपर्युक्त धागा जागृत हो जाता है और इसकी गतिविधि फिर से शुरू होती है।

यहाँ पूरे वास्तुकला का एक प्रतिनिधित्व है:

  • आईआईएस अनुप्रयोग -> Q1 -> MainService
  • MainService -> Q2 -> AuxService
  • AuxService -> Q3 -> MainService

हालांकि सभी परिचालन वनवे के साथ चिह्नित हैं, मैं सोच रहा हूं कि किसी अन्य एमएसएमक्यू ऑपरेशन के भीतर से एमएसएमक्यू ऑपरेशन शुरू करना किसी भी तरह अवैध है। ऐसा लगता है कि अनुभवजन्य सबूत दिए गए हैं। यदि हां, तो क्या इस व्यवहार को बदलने के लिए दूर है?

संपादित करें # 2:

ठीक है, कुछ और खुदाई के बाद ऐसा लगता है WCF दोषी है। मैंने एमएसएमक्यू एसडीके का उपयोग करने के लिए मुख्य सेवा में क्लाइंट कोड और ऑक्स सेवा में सर्वर कोड को स्विच किया और यह अपेक्षा के अनुसार काम करता है। मैं जिस 3 मिनट का टाइमआउट अनुभव कर रहा था वह वास्तव में वह समय था जिसके बाद मेन सर्विस ने छोड़ दिया और माना कि ऑक्स सेवा विफल रही है। इसलिए, ऐसा लगता है कि किसी कारण से डब्ल्यूसीएफ वर्तमान डब्लूसीएफ गतिविधि से बाहर निकलने तक इनकार करने से इंकार कर देता है।

क्या यह डिज़ाइन द्वारा है या यह एक बग है? क्या यह व्यवहार नियंत्रित किया जा सकता है?

+0

क्या आप प्रमाणीकरण का उपयोग करते हैं? कभी-कभी ये देरी प्रमाणीकरण से संबंधित नेटवर्किंग/आधारभूत संरचना समस्याओं से संबंधित होती हैं। – Groo

+0

मैं किसी प्रमाणीकरण का उपयोग नहीं करता हूं। इसके अलावा, 'हर किसी के पास कतार में पूर्ण पहुंच है। –

+0

स्थानीय कतार में एक प्रेषण ऑपरेशन तत्काल है क्योंकि आउटगोइंग कतार की आवश्यकता नहीं है। यदि आपने एमएसएमक्यू को ट्रैक करने के लिए प्रदर्शन मॉनीटर का उपयोग किया है, तो मैं आपको यह संदेश प्राप्त करने की उम्मीद करता हूं कि इसे भेजे जाने पर संदेश वितरित किया जाए। यदि नहीं, तो लेनदेन के लिए प्रतीक्षा में देरी हो सकती है। Easy7 परीक्षण एक गैर-लेनदेन कतार को भेजना होगा और देखें कि क्या वही विलंब होता है। –

उत्तर

1

आपके पास कतार कोड पर लेनदेन सेटअप है, क्या आपके पास लेनदेन के लिए msmq ऑब्जेक्ट सेटअप है? एक वितरित लेनदेन समन्वयक प्रविष्टि के लिए टाइमआउट अवधि की तरह 3 मिनट लगता है।

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