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ファイルへの書き込みを行う場合には、どうあるべきかでチェックします。私はそれに負荷(100並行スレッド)を実行した場合

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

私が手に次のことを私のに表示されるアイテム210ファイル...

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

私は、Java 1.7.0_09の岩下ColdFusionの9.0.1.274733を使用しています。私はRailoを同じJREでテストしましたが、うまくいきます。


追加以下はまた、構造体に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範囲variablesの項目を削除しても問題ありません。 #variables##local#をテンプレートにダンプすると、すべてが予想どおりになります。


(コメントからの更新)

私は以来、あなたが唯一の要求は、変更することが許可されていることを確認するためにあなたのタグの周りにいくつかのロックを追加することを検討可能性があるbug #3352462

+2

ここのリンクは関連性がありますか:https://duckduckgo.com/?q="___IMPLICITARRYSTRUCTVAR0 "? –

+0

はい、同様の問題を指摘する可能性があります。good find –

+1

'ArrayNew(1)'を使用して短い手書き表記を使用し、各項目を個別に設定すると、期待通りに動作するように見えます。 –

答えて

4

これは、上記のピーターの/自分のコメントに基づいています。

配列や構造体の短縮形のバグが多数あり、CF8がその構文を導入して以来ずっと続いています。アドオンの修正方法は、問題を一度正しく並べ替える努力ではなく、ちょっと変わったことだった。別の例を見つけたようです。 CF10でこれがまだ存在するかどうかを知ることは面白いだろう。私は彼らが開発サイクル中にいくつか修正したことを知っているからだ。

唯一の方法は、これらの問題が発生する状況でその表記法を使用しないことです。

bugをアドビで認識してもらえますか?

ここでも少しは注目に値するが、あなたの特定の問題とは関係ありません。CFはまだJava 1.7ではサポートされていません。あなたはそれを念頭に置いておきたいかもしれません。

+0

ありがとうございます。 ColdFusionは、ショートハンドをサポートするために、本当にファンキーなことをしているようです。とにかく、私はそれをバグとして提起しました。#3352462 ... https://bugbase.adobe.com/index.cfm?event=bug&id=3352462 –

0

として、この問題を提起しましたファイル。

+0

ファイルが期待どおりに動いた場合は、ファイルに触れないのが理想です。だから、元の問題は解決しません。 –

0

最初の例では、ブール値ではなく配列としてtmpを宣言すれば、それは何か違いはありますか?

<cfset var tmp = ArrayNew(1) /> 

代わりに...

<cfset var tmp = false /> 
関連する問題