2012-10-24 7 views
6

Jestem umieszczenie elementu w moim zakresie aplikacji tak, że jest wspólna dla wszystkich żądań i zawiera aa CFM szablonu:współbieżności i scoping problemy podczas CFM wliczone jest od wewnątrz 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> 

szablonu, który jest wchodzących po prostu tworzy tablicę i sprawdza długość tablicy jest to, co powinno być, jeśli nie zapisuje go do pliku error.log:

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

Gdybym wtedy uruchomić ładunek po nim (z 100 jednoczesnych wątków) pojawia się następujący elementy pojawiające się w moim error.log plik ...

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

Uwaga Używam ColdFusion 9.0.1.274733 ontop Java 1.7.0_09. Testowałem Railo na tym samym JRE i działa dobrze.


dodatkowe następujące przyczyny również problem, zmieniając zmienną tmp do struktury i dodanie elementu losowego w zakresie variables że nie odwołuje nigdzie ...

<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> 

który obejmuje szablon bardzo podobny do pierwszego, który wygląda tak ...

<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> 

Jeśli ou usunąć przedmiot z zakresu variables, który działa poprawnie. Jeśli wyrzucisz w szablonie #variables# i #local#, wszystko znajdzie się tam, gdzie można się tego spodziewać.


(Aktualizacja z komentarzami)

Mam ponieważ poruszyła tę kwestię jako bug #3352462

+2

Czy którekolwiek z linków mają znaczenie: https://duckduckgo.com/?q="___IMPLICITARRYSTRUCTVAR0 "? –

+0

Tak, wygląda na to, że może wskazywać na podobny problem, dobrze znaleźć –

+1

Wpływa tylko na to, gdy używa się notacji krótkiej dla tablicy, używając 'ArrayNew (1)' i ustawienie każdego elementu indywidualnie wydaje się działać zgodnie z oczekiwaniami –

Odpowiedz

4

ta opiera się na własnych uwag/Piotra powyżej.

Było wiele błędów z tablicą i skrótem strukturalnym, i od czasu wprowadzenia CF8 wprowadzono składnię. Podejście Adobe do naprawienia ich było trochę jak whack-a-mole, a nie wysiłkiem, aby rozwiązać problem raz i prawidłowo. Wygląda na to, że znalazłeś inny przykład tego. Byłoby interesujące zobaczyć, czy nadal istnieje w CF10, ponieważ wiem, że naprawiono więcej podczas cyklu deweloperskiego.

Jedynym sposobem uniknięcia tej notacji w sytuacjach, w których występują te problemy.

Czy mógłbyś podnieść bug, aby Adobe wiedział o tym?

Też nieznacznie godne uwagi, ale niezwiązane z konkretnym problemem tutaj: CF nie jest jeszcze obsługiwany w Javie 1.7. Możesz to mieć na uwadze.

+0

Dzięki. Tak, wydawałoby się, ColdFusion robi naprawdę fajne rzeczy, żeby wspierać stenografię. W każdym razie, podniosłem go jako błąd # 3352462 ... https://bugbase.adobe.com/index.cfm?event=bug&id=3352462 –

0

Można rozważyć dodanie jakąś blokadę wokół tagu, aby zapewnić tylko jeden wniosek jest uprawniony do modyfikowania plik.

+0

Idealnie plik nigdy nie powinien być dotykany, jeśli działał zgodnie z oczekiwaniami. To nie rozwiązuje pierwotnego problemu. –

0

W twoim pierwszym przykładzie, czy robi różnicę, jeśli zadeklarujesz tmp jako tablicę zamiast boolowskiej?

<cfset var tmp = ArrayNew(1) /> 

zamiast ...

<cfset var tmp = false /> 
Powiązane problemy