2013-08-29 7 views
8

मैं QueueClient (विंडोज़ Azure सेवा बस पैकेज संस्करण 2.1.2.0) पर PeekBatch(<messageCount>) विधि का उपयोग कर रहा हूं।Azure सेवा बस कतार PeekBatch लॉकिंग?

यह पहली बार ठीक काम करता है, और मेरी कतार में मौजूद एकमात्र संदेश लौटाता है, लेकिन बाद में कॉल कुछ भी नहीं लौटाता है। पांच मिनट के बाद, कॉल फिर से संदेश वापस कर देगा।

BrokeredMessage पर अधिकतम मिनट अधिकतम लॉक टाइम है, इसलिए मुझे आश्चर्य है कि PeekBatch वास्तव में उन संदेशों को लॉक कर रहा है जैसे कि यह प्राप्त होता है, भले ही peeking को लॉक नहीं करना चाहिए, जहां तक ​​मुझे पता है।

मैं एक एमवीसी दृश्य बनाने की कोशिश कर रहा हूं ताकि यह देखने में सक्षम हो कि वास्तव में मेरी कतार में क्या बैठ रहा है, लेकिन यह एक रास्ते में हो रहा है। क्या कोई इस पर कोई मार्गदर्शन प्रदान कर सकता है?

अद्यतन: यह केवल तब होता है जब मैं एक स्थिर संपत्ति का उपयोग कर अपने QueueClient को कैश करता हूं। यदि मैं हर बार QueueClient ताजा बना देता हूं, तो PeekBatch अपेक्षा के अनुसार काम करता है। मुझे अभी भी पता नहीं है कि QueueClient का पुन: उपयोग क्यों किया जाता है। Microsoft seems to recommend reusing the QueueClient though, हर बार इसे पुनर्जीवित करने के बजाय, इसलिए मैं अभी भी एक नुकसान में हूं।

उत्तर

13

क्यूई क्लाइंट कुछ हद तक सहायक है। Peek विधियों (Peek और PeekBatch) में आप उन्हें बस कॉल कर सकते हैं, या आप एक निश्चित अनुक्रम संख्या के बाद एक विशिष्ट संदेश पुनर्प्राप्त करने के लिए एक विशिष्ट अनुक्रम संख्या दे सकते हैं। यदि आप बस पेक को कॉल करते हैं, या आपके मामले में पेकबैच में, अनुक्रम संख्या के बिना, तो यह कतार में पहला संदेश या संदेश पुनर्प्राप्त करेगा। एक बार संदेश लौटाए जाने के बाद, क्यूई क्लाइंट खींचने वाले अंतिम अनुक्रम संख्या का ट्रैक रखता है। Peek के लिए प्रत्येक आगामी कॉल कतार में अगला संदेश लाएगा। विचार यह है कि आप संदेशों को "ब्राउज़िंग" कर रहे हैं और कतार पर पहले संदेश में रुचि रखते हैं।

तो, यदि आप एक लूप में थे और बार-बार चोटी कहा जाता है जब तक कि यह एक संदेश नहीं लौटाता, तो आप अनिवार्य रूप से कतार में सभी संदेश ब्राउज़ करेंगे।

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

यदि आपको वास्तव में केवल पहले संदेश को देखने की आवश्यकता है तो केवल एक बार देखें। यह केवल पहला संदेश लौटाएगा। यदि आपको हर बार एक संदेश (0) करते समय लगातार संदेश खींचने की आवश्यकता होती है। यदि आप पहली बार 10 संदेश पहले कहना चाहते हैं तो PeekBatch (0, 10) पर कॉल करें; यह कहने जैसा होगा कि मुझे पहले दस संदेश दें जिनमें अनुक्रम संख्या 0 से अधिक है।

QueueClient का पुन: उपयोग करने का मार्गदर्शन ध्वनि है। यह जानकारी और चीजों के कैशिंग के सभी प्रकार कर रहा है। आप हर बार इसे फिर से बनाना नहीं चाहते हैं।

+0

शानदार उत्तर! यह वैसे ही काम करता है जैसा आपने वर्णन किया था, और अब मैं चाहता हूं कि मैंने कोशिश की थी कि ओवरलोड पहले से ही शून्य हो। :) एमएसडीएन दस्तावेज़ों में चोटी के तरीकों के लिए थोड़ी अधिक जानकारी होनी चाहिए। शायद मैं कोशिश करूँगा और वहां एक टिप्पणी जोड़ूंगा। – Michael

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