2012-10-24 21 views
6

,使其在所有請求共享,它包括AA CFM模板我設置零件在我的應用範圍內包括範圍的問題:併發當CFM從CFC

<cfcomponent output="false"> 

    <cffunction name="run" output="false" returntype="void"> 

     <cfset var tmp = false/> 

     <cftry> 
      <cfinclude template="inc.cfm"/> 
      <cfcatch> 
       <cffile action="append" 
         file="#ExpandPath("error.log")#" 
         output="ERROR: #cfcatch.message#"/> 
      </cfcatch> 
     </cftry> 

    </cffunction> 

</cfcomponent> 

該模板被列入只需創建一個數組,並檢查數組的長度是它應該是什麼,如果不將其寫入error.log文件:

<cfset tmp = [ 
    "one", 
    "two", 
    "three" 
]/> 
<cfif ArrayLen(tmp) neq 3> 
    <cffile action="append" 
      file="#ExpandPath("error.log")#" 
      output="Length = #ArrayLen(tmp)#"/> 
</cfif> 

如果我再碰到這樣的負載(100個併發線程)我得到以下項目出現在我的error.log文件...

ERROR: element at position 3 of array variable &quot;___IMPLICITARRYSTRUCTVAR0&quot; cannot be found. 
Length = 0 
Length = 2 

注意我使用ColdFusion 9.0.1.274733 ontop的的Java 1.7.0_09的。我在同一個JRE上測試過Railo,它工作正常。


附加下還導致一個問題,改變tmp可變的結構和在不被任何引用variables範圍添加一個隨機項...

<cfcomponent output="false"> 

    <!--- 
    Some random variable that does nothing with the exception 
    of being the facilitator of my eternal pain 
    ---> 
    <cfset variables.t = {}/> 

    <cffunction name="run" output="false" returntype="void"> 

     <cfset var tmp = {}/> 

     <cftry> 
      <cfinclude template="inc2.cfm"/> 
      <cfcatch> 
       <cffile action="append" 
         file="#ExpandPath("error.log")#" 
         output="ERROR: #cfcatch.message#"/> 
      </cfcatch> 
     </cftry> 

    </cffunction> 

</cfcomponent> 

其中包括與第一個非常相似的模板,看起來像這樣...

<cfset tmp.arr = [ 
    "one", 
    "two", 
    "three" 
]/> 
<cfif ArrayLen(tmp.arr) neq 3> 
    <cffile action="append" 
      file="#ExpandPath("error.log")#" 
      output="Length = #ArrayLen(tmp.arr)#"/> 
</cfif> 

如果y ou刪除variables範圍內的物品,它的工作正常。如果您在模板中轉儲#variables##local#,則所有內容都是您所期望的。


(從評論更新)

我,因爲提出這個問題作爲一個bug #3352462

+2

這裏的任何鏈接是否有任何相關性:https://duckduckgo.com/?q="___IMPLICITARRYSTRUCTVAR0「? –

+0

是的,看起來像它可能指向一個類似的問題,好發現 –

+1

它也隻影響它時使用陣列的短手符號,使用'ArrayNew(1)'並單獨設置每個項目似乎按預期工作 –

回答

4

這是基於彼得的/你自己的上述評論。

自從CF8引入了語法以來,已經存在一些有數組和結構速記概念的錯誤。 Adobe修復它們的方法有點像鼴鼠,而不是努力將問題排除一次,並且正確。看起來你已經找到了另一個例子。儘管如此,看看它是否仍然存在於CF10中會很有趣,因爲我知道它們在開發週期中更多地固定了它。

解決此問題的唯一方法是在出現這些問題的情況下不使用該表示法。

您是否可以爲此提出bug以便Adobe知道它?

也稍微值得注意,但與您的特定問題無關:此Java尚未支持CF。你可能想牢記這一點。

+0

謝謝。是的,看起來ColdFusion似乎會做一些非常時髦的事情來支持shorthanding。無論如何,我已經提出它作爲一個錯誤#3352462 ... https://bugbase.adobe.com/index.cfm?event=bug&id=3352462 –

0

,可以考慮添加一些鎖定在你的標籤,以確保只有一個請求被允許修改文件。

+0

理想情況下,文件不應該被觸及,如果它按預期工作。所以這並不能解決原來的問題。 –

0

在你的第一個例子中,如果你將tmp聲明爲一個數組而不是布爾值,它會有什麼區別嗎?

<cfset var tmp = ArrayNew(1) /> 

的,而不是...

<cfset var tmp = false />