ColdFusion Variables दौड़ की स्थिति?



race-condition (1)

PageManager घटक के प्रदर्शन कंटेंट समारोह (जो इस प्रकार साझा किए गए आवेदन के हिस्से के रूप में तत्काल) के अंदर भिन्नताएं का उपयोग, समस्या थी। इस मामले में वर्जनबल स्कोप को साझा किया जाएगा जिससे दौड़ की स्थिति बढ़ेगी।

उस घटक को दूसरे घटक में डुप्लिकेट करने और इसे index.cfm के वर्जनबल के दायरे में तत्काल बनाने के बाहर, आप डिस्प्ले कंसल्टेंट फंक्शन में वर्जनबल स्कोप से भी स्थानीय क्षेत्र में स्विच कर सकते हैं (यह मानते हुए कि आपको इन व्हेरिएबल्स के बाहर एक्सेस की आवश्यकता नहीं है समारोह)। दोनों तरीकों से रेस की स्थिति को फिर से प्रदर्शित होने पर रखा गया जब जम्मू के साथ तनाव परीक्षण किया गया।

मैं कुछ मदद करना चाहूंगा कि क्यों यह विशेष कोड, दुर्लभ परिस्थितियों में, एक दौड़ की स्थिति पैदा करता है। मुझे एक तय मिला है, जो मैं भी रूपरेखा करता हूं, लेकिन मैं वास्तव में इसे समझना चाहता हूं।

हमारे पास एक सीएमएस आधारित प्रणाली है जिसमें कई मॉड्यूल शामिल हैं जो ढीले से फ़्यूज़बॉक्स मॉडल पर आधारित होते हैं। सब कुछ एक एकल index.cfm के माध्यम से चलाता है।

हमारे Index.cfm में हम घटकों के कुछ उदाहरण बना रहे हैं, कुछ को APPLICATION पर बकाया है। PortalApp उदाहरण Application.cfc में बनाया गया है। मैं उस कोड को शामिल नहीं कर रहा हूँ क्योंकि यह पूरी तरह से प्रासंगिक नहीं है:

<cfset REQUEST.ActionHandler = CreateObject("Component", "Components.ActionHandler").init(APPLICATION.PortalApp.Config) />
<cfset VARIABLES.Modules = CreateObject("Component", "Components.Modules").init(APPLICATION.PortalApp.Config, REQUEST.ActionHandler.GetModuleList(), REQUEST.ActionHandler.GetSuppressOutput(), REQUEST.ActionHandler.GetRoleList(), REQUEST.ActionHandler.GetAccessList(), REQUEST.ActionHandler.GetMasterRoleList()) />

इन वस्तुओं को इन्स्तांत करने के बाद, हम पेजमैनेजर घटक को कॉल करके पेज पर मॉड्यूल के लिए सामग्री प्राप्त करते हैं (उनके 'फलक' के आधार पर: शीर्ष, बायां, मध्य, दाएं), अनुप्रयोग के भाग के रूप में इंस्टाल्ट किया जाता है।

<cfsavecontent variable="Variables.Portal_Content.Top"><cfset APPLICATION.PortalApp.PageManager.DisplayContent( SESSION, REQUEST.ActionHandler, VARIABLES.Modules, 0  ) /></cfsavecontent>
<cfsavecontent variable="Variables.Portal_Content.Left"><cfset APPLICATION.PortalApp.PageManager.DisplayContent( SESSION, REQUEST.ActionHandler, VARIABLES.Modules, 1  ) /></cfsavecontent>
<cfsavecontent variable="Variables.Portal_Content.Middle"><cfset APPLICATION.PortalApp.PageManager.DisplayContent( SESSION, REQUEST.ActionHandler, VARIABLES.Modules, 2  ) /></cfsavecontent>
<cfsavecontent variable="Variables.Portal_Content.Right"><cfset APPLICATION.PortalApp.PageManager.DisplayContent( SESSION, REQUEST.ActionHandler, VARIABLES.Modules, 3  ) /></cfsavecontent>

PageManager.DisplayContent मूल रूप से मॉड्यूल पर loops और एक आवरण में उन्हें लपेटता है। हालांकि, कुछ बिंदुओं पर, दौड़ की स्थिति और फ़ंक्शन क्रेटर होते हैं और सभी पर कोई मॉड्यूल प्रदर्शित नहीं होता है। ऐसा लगता है कि वर्जनों पर आधारित। मॉड्यूल भ्रष्ट हो जाते हैं, लेकिन यह वर्बियन स्कोप में है जो साझा नहीं किया गया है।

इसे ठीक करने के लिए, हमने कोड को निम्न में बदल दिया है:

<!--- If we do not use VARIABLES scope and create a ContentManager, race condition can cause empty modules --->
<cfset VARIABLES.CurrPageMgr = CreateObject("Component", "Components.ContentManager").init() />

<cfsavecontent variable="Variables.Portal_Content.Top"><cfset VARIABLES.CurrPageMgr.DisplayContent( SESSION, REQUEST.ActionHandler, VARIABLES.Modules, 0  ) /></cfsavecontent>
<cfsavecontent variable="Variables.Portal_Content.Left"><cfset VARIABLES.CurrPageMgr.DisplayContent( SESSION, REQUEST.ActionHandler, VARIABLES.Modules, 1  ) /></cfsavecontent>
<cfsavecontent variable="Variables.Portal_Content.Middle"><cfset VARIABLES.CurrPageMgr.DisplayContent( SESSION, REQUEST.ActionHandler, VARIABLES.Modules, 2  ) /></cfsavecontent>
<cfsavecontent variable="Variables.Portal_Content.Right"><cfset VARIABLES.CurrPageMgr.DisplayContent( SESSION, REQUEST.ActionHandler, VARIABLES.Modules, 3  ) /></cfsavecontent>

ContentManager का DisplayContent पेजमैनेजर के रूप में एक ही फ़ंक्शन पाठ है। ContentManager पर अपवाद के साथ ही APPLICATION के भाग के रूप में मौजूदा वर्जनबल स्कोप और पेजमैनेजर में मौजूद है।

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

मैं 100% यकीन भी नहीं करता हूँ कि यह ठीक काम करता है, लेकिन अभी तक जेएमटर ने इसके साथ शर्त को निकाल नहीं दिया है

संपादित करें: प्रति अनुरोध, प्रदर्शन कंटेंट फ़ंक्शन:

<cffunction name="displayContent" access="public" output="true">
    <cfargument name="SessionData" required="yes" type="Struct" />
    <cfargument name="ActionHandler" required="yes" type="ActionHandler" />
    <cfargument name="Modules" required="yes" type="Modules" />
    <cfargument name="Pane" required="yes" type="numeric" />
    <cfswitch expression="#Arguments.Pane#">
        <cfcase value="1"><cfset Variables.blnPane = ARGUMENTS.Modules.getLeft()></cfcase>
        <cfcase value="2"><cfset Variables.blnPane = ARGUMENTS.Modules.getCenter()></cfcase>
        <cfcase value="3"><cfset Variables.blnPane = ARGUMENTS.Modules.getRight()></cfcase>
        <cfdefaultcase><cfset Variables.blnPane = ARGUMENTS.Modules.getTop()></cfdefaultcase>
    </cfswitch>
    <cfif VARIABLES.blnPane>
        <cfset VARIABLES.qryPaneModules = ARGUMENTS.Modules.GetModulesInPane(Arguments.Pane)>
        <cfset VARIABLES.aryModulesInPane = ArrayNew(1)>
        <cfloop query="VARIABLES.qryPaneModules">
            <cfset VARIABLES.blnResult = ArrayAppend(aryModulesInPane,VARIABLES.qryPaneModules.MOD_SYS_NR)>
        </cfloop>
        <cfset VARIABLES.Template = "../CustomTags/Portalv#ARGUMENTS.SessionData.intPortalVersion#/DisplayModuleAlternate.cfm">
        <cfif Arguments.ActionHandler.GetDocumentType() EQ 3>
            <cfset VARIABLES.Template = "../CustomTags/Portalv#ARGUMENTS.SessionData.intPortalVersion#/DisplayXMLModule.cfm">
        </cfif>
        <cfif VARIABLES.qryPaneModules.recordcount GT 0>
            <cfloop index="VARIABLES.modLoop" from="1" to="#ArrayLen(VARIABLES.aryModulesInPane)#">
                <cfparam name="VARIABLES.aryModulesInPane[VARIABLES.modLoop]" default="0">
                <cfset VARIABLES.objModuleInfo = ARGUMENTS.Modules.GetModuleInfo( VARIABLES.aryModulesInPane[VARIABLES.modLoop], ARGUMENTS.Modules.GetModules() ) />
                <cfif NOT IsNumeric(VARIABLES.objModuleInfo.intModuleID)>
                    <cfset VARIABLES.objModuleInfo.intModuleID = 0 >
                </cfif>
                <cfmodule template="#VARIABLES.Template#"
                    ModuleID="#VARIABLES.objModuleInfo.intModuleID#"
                    ModuleName="#VARIABLES.objModuleInfo.strModuleName#"
                    SecurityLevel="#VARIABLES.objModuleInfo.intRoleTypeID#"
                    ModuleDSN="#VARIABLES.objModuleInfo.strModDBDSN#"
                    ModuleUserName="#VARIABLES.objModuleInfo.strModDBUserID#"
                    ModulePassword="#VARIABLES.objModuleInfo.strModDBPassword#"
                    AlternateFunctionID="#VARIABLES.objModuleInfo.intAlternateFunctionID#"
                    AlternateFunctionName="#VARIABLES.objModuleInfo.strAlternateFunctionName#"
                    InstructionFileID="#VARIABLES.objModuleInfo.intManualID#"
                    ModuleOps="#VARIABLES.objModuleInfo.blnModuleOps#"
                    ModuleSource="#VARIABLES.objModuleInfo.strModuleSource#"
                    ItemID="#VARIABLES.objModuleInfo.intModItemID#"
                    AutoLoginID="#VARIABLES.objModuleInfo.intAutoLoginCategoryID#"
                    IPS_objPortalSessionData="#ARGUMENTS.SessionData#"
                    ModuleList="#ARGUMENTS.ActionHandler.GetModuleList_SingleRecord(VARIABLES.objModuleInfo.intModuleID)#"
                    ModulesComponent="#ARGUMENTS..Modules#"
                    ControlHeaderIR = "#VARIABLES.objModuleInfo.blnControlHeaderIR#"
                    BorderIR = "#VARIABLES.objModuleInfo.blnBorderIR#"
                    IPS_strPortalRoot = "#VARIABLES.IPS_strPortalRoot#"
                    IPS_strPortalURL = "#VARIABLES.IPS_strPortalURL#"
                    Wrapper = "#Arguments.ActionHandler.getWrapper()#"
                    Definition = "#VARIABLES.objModuleInfo.strModuleDef#"
                    Category = "#VARIABLES.objModuleInfo.strModuleCat#"
                    aryModulesInPane = "#VARIABLES.aryModulesInPane#"
                    blnLockIR = "#VARIABLES.objModuleInfo.blnLockIR#"
                    strMessageTE = "#VARIABLES.objModuleInfo.strMessageTE#" >

            </cfloop>
        </cfif>
    </cfif>
</cffunction>