2012-05-15 2 views
8

अद्यतन

मैं शुरू से जोड़ लिया है चाहिए - यह माइक्रोसॉफ्ट डायनेमिक्स सीआरएम मेंमेरे सीआरएम वर्कफ़्लो पर अनंत लूप सुरक्षा क्यों चल रही है?


है मैं सीआरएम अच्छी तरह से पता है, लेकिन मैं एक नुकसान में हूँ मेरे वर्तमान तैनाती पर व्यवहार की व्याख्या करने के लिए ।

कृपया मेरी परिदृश्य की रूपरेखा को समझने में मेरी सहायता करें कि मेरी कौन सी धारणाएं/समझ गलत है (और इसलिए इस त्रुटि का कारण क्या है)। यह मेरी अपेक्षाओं के अनुरूप नहीं है।

बेसिक परिदृश्य

  • आवश्यकता की मांग है कि एक वेब सेवा हर एक्स मिनट कहा जाता है
  • मैं एक कार्यप्रवाह/कस्टम इकाई का उपयोग करने का विकल्प चुना है (यह एक डेटाबेस सूचकांक को आइटम लंबित कहते हैं) ट्रिगर मॉडल (यानी मेरे पास एक कस्टम इकाई है जिसमें एक क्रिएटिव प्लगइन पंजीकृत है। प्लगइन मेरे तर्क को निष्पादित करता है। "पूरा" समय + [टाइमआउट अवधि] समाप्त होने पर एक साथ वर्कफ़्लो प्रारंभ होता है। समाप्ति पर, यह एक नया ट्रिगर रिकॉर्ड बनाता है और वर्कफ़्लो समाप्त होता है)।
  • प्लगइन तर्क ठीक काम करता है। कार्यप्रवाह अवधारणा एक बिंदु के लिए ठीक काम करता है, लेकिन समय की अवधि के बाद कार्यप्रवाह एक विफलता के साथ रुक:

    इस कार्यप्रवाह काम रद्द कर दिया गया क्योंकि कार्यप्रवाह है कि यह शुरू कर दिया अनंत लूप शामिल थे। वर्कफ़्लो तर्क को सही करें और पुनः प्रयास करें। वर्कफ़्लो तर्क के बारे में जानकारी के लिए, सहायता देखें।

तो संक्षेप में - मानक अनंत लूप का पता लगाने। मैं अवधारणा को समझता हूं और यह क्यों मौजूद है।

विशिष्ट तैनाती

सबसे पहले, मुझे लगता है कि यह काफी सुरक्षित है हमें इस परिदृश्य में प्लगइन कोड की सामग्री पर ध्यान करने के लिए। यह ठीक काम करता है, यह परमाणु है और सीआरएम को मुश्किल से छूता है (स्पष्ट होने के लिए, यह एक प्री-इवेंट प्लगइन है जो रिमोट वेब सेवा चलाता है, प्रतिक्रिया का इंतजार करता है और फिर पास होने से पहले मेरे ट्रिगर रिकॉर्ड पर "पूर्ण" तिथि/समय विशेषता सेट करता है लक्ष्य इकाई वापस पाइपलाइन में)। जब तक एक ट्रिगर रिकॉर्ड बनाया जाता है, यह कोड चलता है और जो करता है वह करता है।

प्लगइन की सामग्री रियायती करने के बाद, एक मुद्दा है कि मैं इकाई के पूर्व बनाने के कदम पर पंजीकृत प्लगइन होने में सराहना करते नहीं है हो सकता है ...

ताकि कार्यप्रवाह ही छोड़ देता है । यह एक साधारण है। यह thusly चलाता है:

  1. एक नया ट्रिगर इकाई के निर्माण पर ...
  2. यह Trigger.new_completedon + 15 मिनट
  3. टाइमआउट पर
  4. की एक समय समाप्ति है, यह कोई साथ (एक नया ट्रिगर रिकॉर्ड बनाता है " "मान पर पूरा - यह प्लगइन द्वारा सेट किया गया है याद रखें)
  5. यह सब कुछ नहीं है - कोई स्पष्ट" अंत वर्कफ़्लो "(हालांकि मैंने अभी अभी एक जोड़ा है और इसे परीक्षण सेट कर देगा ...)

इस सेट-अप के साथ, मैं मैन्युअल रूप से एक नया ट्रिगर रिकॉर्ड बना देता हूं और प्रक्रिया अच्छी तरह से क्रिया में स्पिन करती है। रोल आगे 1h 58 मिनट (मेरे द्वारा चलाए गए अंतिम चक्र के आधार पर - याद रखना कि मेरे प्लगइन कोड को चलाने के लिए एक मिनट लग सकता है), 7 सफल निष्पादन चक्र (यानी नई वर्कफ़्लो नौकरियां बनाई और पूरी की जा रही हैं) के बाद, 8 वां व्यक्ति विफल रहता है उपरोक्त त्रुटि।

क्या मैं पहले से ही पता (मुझे सही करें जहां मैं गलत हूँ)

Recursion depth, by default, is set to 8। यदि वर्कफ़्लो/प्लगइन स्वयं 8 बार कॉल करता है तो एक अनंत लूप का पता लगाया जाता है।

Recursion depth is reset every one hour (or 10 minutes - see "Warnings" in linked blog?)

Recursion depth settings can be set via PowerShell या SDK कोड ऑन-प्रिमाइसेस तैनाती केवल (via the Set-CrmSetting Cmdlet)

क्या मैं सुनने के लिए नहीं करना चाहते हैं (कृपया) में Deployment Web Serviceका उपयोग कर

"रिकर्सन गहराई सेटिंग्स बदलें"

मैं परिनियोजन रिकर्सन गहराई सेटिंग्स को बदल नहीं सकता क्योंकि यह ऑनलाइन परिदृश्य में एक विकल्प नहीं है - आखिरकार मैं सीआरएम ऑनलाइन पर भी तैनात होगा।

"अपने कार्यप्रवाह पर समय समाप्ति की अवधि बढ़ाने के लिए" यह एक विकल्प नहीं है या तो - अनुक्रमणः हर 15 मिनट में होने के लिये, आदर्श जितनी जल्दी की जरूरत है।

अद्यतन

@Boone नीचे कि प्रत्यावर्तन गहराई टाइमआउट निष्क्रियता के 60 मिनट के बजाय हर 60 मिनट के बाद रीसेट का सुझाव दिया। इसमें पहली गलतफहमी है।

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

+0

वर्कफ़्लो स्वयं को कॉल कर रहा है, यही कारण है कि आप एक अनंत लूप में समाप्त होते हैं। आपको पूरे दृष्टिकोण पर पुनर्विचार करना होगा, गहराई को बढ़ाने या टाइमआउट अवधि केवल अनंत लूपिंग के कारण प्रक्रिया की हत्या में देरी होगी। – Alex

+0

आपके उत्तर के लिए धन्यवाद एलेक्स - आपने इसे सरल बना दिया है लेकिन मुझे नहीं लगता कि ऐसा है। यहां तक ​​कि अगर हम स्वीकार करते हैं कि वर्कफ़्लो स्वयं को कॉल कर रहा है (एमएससीआरएम सोचता है कि ऐसा नहीं है, तो मुझे लगता है कि यह नहीं है - वर्कफ़्लो एक नया रिकॉर्ड बनाता है, बजाय एक बच्चे के वर्कफ़्लो के रूप में खुद को बुलावा देने के बजाय। मुझे उम्मीद है कि यह एक नया " धागा "- यद्यपि शायद प्लगइन का सहसंबंध आईडी माता-पिता से प्राप्त होता है और बाद के बाल वर्कफ़्लो तक जाता है), रिकर्सन की गहराई हर 10 या 60 मिनट में रीसेट की जानी चाहिए लेकिन यह नहीं है। –

+0

मेरा मानना ​​है कि एमएससीआरएम वास्तव में अप्रत्यक्ष रिकर्सन को वास्तव में सहसंबंध के कारण होने के कारण पहचानता है, यही कारण है कि लूप का पता लगाना। मैं चिंतित हूं, थोड़ा प्रयोग करेगा और आपको वापस ले जाऊंगा (यह वास्तव में मेरे लिए भी उपयोगी हो सकता है, कौन जानता है कि मुझे एक समान आवश्यकता कब मिलेगी? (:) – Alex

उत्तर

2

एक घंटे के लिए "रीसेट" होने के लिए आपको एक घंटे के लिए कोई गतिविधि नहीं है। यह मूल से केवल 1 घंटे रीसेट नहीं करता है। इसलिए चूंकि आपके पास हर 15 मिनट में गतिविधि होती है, इसलिए इसे रीसेट करने का मौका कभी नहीं होता है। मुझे नहीं पता कि पत्थर में कहीं भी कहा जाता है ... लेकिन मेरे अनुभव से।

सीआरएम 4 में सीआरएम सेवा (Google creating a CRM service in the child pipeline) बनाना संभव था और सहसंबंध आईडी (CorrelationToken.NewToken() का उपयोग करके रीसेट करना संभव था। मुझे 2011 एसडीके में इतना आसान नहीं दिख रहा है। कोई विचार नहीं है कि यह चाल ऑनलाइन पर्यावरण में काम करती है। सीआरएम 4 प्लग-इन के साथ 2011 ऑनलाइन पीछे संगत है?

एक चीज जिसे आप कोशिश कर सकते हैं, IxecutionContext.CorrelationId का उपयोग एसिंकेशन (सिस्टम जॉब) तालिका को स्कैन करने के लिए किया जाएगा। लेकिन मेटाडाटा के अनुसार, मुझे लगता है कि विशेषता उपयोगी हो सकती है (सहसंबंध आईडी, सहसंबंध अद्यतन दिनांक, गहराई) अद्यतन के लिए मान्य नहीं हैं। शायद आप पंक्तियां हटा सकते हैं? यहां तक ​​कि मदद नहीं कर सकता है।

+0

धन्यवाद बूयोन।मैंने "एक घंटा" नहीं माना था जिसका अर्थ निष्क्रियता के 60 एमएनआईएस है और अभी भी एसडीके को पढ़ने के लिए संघर्ष करना है - लेकिन यह सुनकर दिलचस्पी है कि यह आपका अनुभव है (कोई आश्चर्य नहीं कि दस्तावेज़ गलत हैं ...!)। मैंने संक्षेप में CorrelationId के साथ कुछ करने पर विचार किया, इसे लॉगिंग के पूरे मार्ग के बिना और इसे कारण के रूप में जांचना (जो अब मैं एलेक्स की टिप्पणियों के बाद करूँगा) लेकिन ध्यान दिया कि इसमें केवल एक गेटर है इसलिए इसे अपडेट नहीं किया जा सकता है। मुझे विश्वास नहीं है कि वी 4 प्लगइन सीआरएम ऑनलाइन के लिए मान्य हैं, इसलिए सीआरएम सेवा चाल व्यवहार्य नहीं होगी या तो मुझे डर है। –

+0

हां - रेत के बक्से वाले प्लगइन में हासिल करना मुश्किल हो सकता है। मुझे नहीं लगता कि आप प्रतिबिंब का उपयोग कर सकते हैं (जिसका उपयोग निजी सदस्य/सेटर पर पाने के लिए किया जा सकता है)। ऑनलाइन माहौल में आप बाहरी सेवा तक सीमित हो सकते हैं। यहां तक ​​कि यदि आप काम करने के लिए एलेक्स कोड प्राप्त करने में सक्षम थे, तो आप पिछले संदर्भ से CorrelationId सेट नहीं करना चाहते हैं, तो आप एक नया आईडी (वह बिंदु) का उपयोग करना चाहते हैं। –

+0

अच्छी तरह से रास्ते से सवाल सोचा। यहां उम्मीद है कि मुझे रेत के बक्से वाले ऑनलाइन पर्यावरण में मेरे सहसंबंध-बदलते सीआरएम 4 प्लग-इन को अपडेट करने की आवश्यकता नहीं है :) –

2

मुझे संदेह है कि इस तरह हल किया जा सकता है।

मैं एक अलग दृष्टिकोण का सुझाव चाहते हैं: सीआरएम के साथ एक सरल आवेदन की तैनाती और जाने यह कॉल वेब सेवा, जो बारी में आदेश रिकॉर्ड को परिवर्तित करने में XRM अंतिमबिंदुओं उपयोग कर सकते हैं।

अद्यतन

या, आप प्लगइन में अपनी सीआरएम सेवा प्रारंभ पर कुछ इस तरह की कोशिश कर सकते हैं (इसे खोदा मेरी प्लगइन्स की ओर से) अपने कार्यप्रवाह अछूते ही रहे:

CrmService service = new CrmService(); 
//initialize service here, then... 

CorrelationToken newtoken = new CorrelationToken(); 
newtoken.CorrelationId = context.CorrelationId; 
newtoken.CorrelationUpdatedTime = context.CorrelationUpdatedTime; 

// WILD GUESS: Enforce unlimited depth ? 
corToken.Depth = 0; // THIS WAS: context.Depth; 

//updating correlation token 
service.CorrelationTokenValue = corToken; 

मैं मान लीजिए मुझे इस बारे में बहुत कुछ याद नहीं है (कोड लगभग 2 साल पहले की तारीखें), लेकिन इससे मदद मिल सकती है।

+0

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

+0

@ ग्रेग मैंने कुछ कोड जोड़ा जो मदद कर सकता है (या नहीं, मेरे पास इसका परीक्षण करने का कोई तरीका नहीं है) – Alex

+0

+1 हालांकि यह अपेक्षाकृत अधिक आक्रामक दृष्टिकोण है, शायद यह वह मार्ग है जिसे मैं अंदर जाना चाहता था समाप्त। उम्मीद है कि यह इस सवाल से क्यों हो रहा है, इसकी बेहतर समझ मिलेगी। बूने की अचूक "60 मिनट निष्क्रियता" अवधि से चिंतित। –

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