2012-06-18 2 views
2

ПРИМЕЧАНИЕ: Я полностью переписал этот вопрос, чтобы учесть новую информацию. Пожалуйста, перечитайте, если вы уже прошли через этот.Неопределенная ошибка при использовании CFThread в пользовательских тегах в ColdFusion 10

Я получаю сообщение об ошибке при использовании cfthread внутри пользовательского тега в ColdFusion 10. В журнале приложений, я получаю следующие данные:

Variable _cffunccfthread_cfThreadTag2ecfm16902001291 is undefined. 

Имя функции это возвращение как ошибка это _cffunccfthread_cf[Page Name Calling the CFThreadTag], а затем номер, который не изменяется от запроса к запросу. Я могу дублировать это каждый раз, когда с помощью следующего кода:

Application.cfc:

component 
{ 
    this.name = "CFThreadCustomTagTest"; 
} 

ThePage.cfm:

<cfthread action="run" name="ThreadTestInPage"> 
    <cflog log="Application" text="The thread in the page successfully ran" type="information" /> 
</cfthread> 
<cf_ThreadTag /> 

ThreadTag.cfm:

<cfif thisTag.ExecutionMode EQ "start"> 
    <cfthread action="run" name="ThreadTest"> 
     <cflog log="Application" text="The thread within the tag successfully ran" type="information" /> 
    </cfthread> 
</cfif> 

Просто отбросьте все три файла в каталоге ColdFusion 10 и загрузите ThePage.cfm. Я получаю следующие записи в журнале приложений:

"Severity","ThreadID","Date","Time","Application","Message" 
"Information","ajp-bio-8012-exec-1","06/19/12","07:18:11",,"C:\ColdFusion10\cfusion\logs\application.log initialized" 
"Information","cfthread-11","06/19/12","07:18:15","CFTHREADCUSTOMTAGTEST","The thread in the page successfully ran" 
"Error","cfthread-9","06/19/12","07:18:15",,"THREADTEST: Variable _cffunccfthread_cfThreadTag2ecfm16902001291 is undefined. " 

Я также заметил, что в сообщении об ошибке для резьбы внутри пользовательского тега, он не содержит имя приложения. Хотя запись в журнале для потока на странице. Обратите внимание, что строка ошибки просто содержит ,, для столбца Application журнала, в то время как успешная нить имеет "CFTHREADCUSTOMTAGTEST".

Если я изменяю ThreadTag.cfm ждать нити внутри тега, чтобы закончить обработку, то все работает отлично, и я получаю две записи в журнале, как я ожидал:

<cfif thisTag.ExecutionMode EQ "start"> 
    <cfthread action="run" name="ThreadTest"> 
     <cflog log="Application" text="The thread within the tag successfully ran" type="information" /> 
    </cfthread> 
    <cfthread action="join" name="ThreadTest" timeout="10" /> 
    <cfdump var="#cfthread#"> 

</cfif> 

И проверить, что там нигде не настроены на фанки, вот мой local development environment's settings summary.

Так что кажется, что если я просто выброшу поток там и не дождусь его завершения, то поток, похоже, ищет что-то с родительской страницы, которая больше не находится в памяти. По крайней мере, это мое совершенно необоснованное предположение :).

Я также подал ошибку с Adobe. Bug number 3218452.

+0

Пожалуйста, разместите код, который выполняется в методе «AddLog» Server.Utilities.Logger. –

+0

Также опубликуйте полный источник функции UpdatePropertyStats() –

+0

UpdatePropertystats не является функцией, это имя потока. Я добавил содержимое функции, вызываемой потоком. –

ответ

2

Я понимаю ваше затруднительное положение, но нет актуального вопрос здесь.

В основном вы нашли ошибку в CF. Несколько человек, включая меня, могут воспроизвести его.

Никто не пропускает ничего, кроме тех инженеров Adobe, которые пропустили, включая такие вещи, при их регрессионном тестировании при внедрении CF10. На самом деле, это не обвинительный акт, поскольку, по-моему, это разумный вопрос?

«переменная» CF не находит на самом деле имя скомпилированного класса, который компилятор CF делает при компиляции кода. Похоже, у меня есть ошибка компилятора.

Например, моя ошибка заключается в следующем: THREADTEST: Variable _cffunccfthread_cfThreadTag2ecfm13713410591 is undefined.

Однако скомпилированный класс: cfThreadTag2ecfm1371341059$func_CFFUNCCFTHREAD_CFTHREADTAG2ECFM13713410591.class

Я не знаю, какая часть имени класса переменной должен быть назван по имени, но я подозреваю, что он должен искать func_CFFUNCCFTHREAD_CFTHREADTAG2ECFM13713410591. Или, с другой стороны, компилятор не должен компилировать файл ThreadTag.cfm как функцию FUNCTION? Но я предполагаю ... может потребоваться скомпилировать код потока как функцию, чтобы вызвать его в отдельном потоке? Это предположение. В любом случае: он компилирует код как одно, а затем ищет другую вещь. из-за ошибки.

Но нижняя строка здесь: да, вы нашли ошибку. И вы отметили это с помощью Adobe. Я не знаю, что еще вам нужно сделать здесь?

Так что в принципе мы теперь знаем, что нельзя иметь вызов <cfthread> в пользовательском теге (я также тестировал через <cfmodule>: та же проблема). Вам придется писать свой код другим способом, используя метод include или метод или что-то в этом роде. Меньше идеала, я знаю, но что вы можете сделать?

Сноска: Я посмотрел на скомпилированный код, и проблема в том, что CF компилирует класс с префиксом func_, но он ссылается на него в коде без него. Я не следил за кодом, чтобы проверить все, что происходит, но мне кажется, что есть ссылки на него, пытаясь загрузить _cffunccfthread_cfThreadTag2ecfm13713410591 вместо правильного имени: func_CFFUNCCFTHREAD_CFTHREADTAG2ECFM13713410591.class.

+1

Первоначально возник вопрос, который был в основном «Я сумасшедший ???». Но на данный момент я согласен, это ошибка, и у меня много людей, которые ее воспроизвели (спасибо!). Я видел ту же проблему, что и 'cfmodule'. В этот момент я извлек код потока из CFC и вызвал метод CFC из пользовательского тега. Это отлично работает, поскольку поток затем вызывается в контексте CFC, а не с исходящего пользовательского тега. –

+1

А, тогда. Чтобы ответить на ваш реальный вопрос, тогда: «по крайней мере, на основании доказательств, которые вы здесь представляете: вы не сумасшедшие. Дальнейшие доказательства могут вполне противоречить этому, хотя» ;-) –

+0

Вы получаете преимущество для этого, чтобы дать мне преимущество сомнения :). Я также отмечаю это как ответ, так как он подтверждает ошибку и помогает описать основную причину проблемы (насколько нам известно). –

0

Дэн,

Пожалуйста, смотрите на этой странице:

http://help.adobe.com/en_US/ColdFusion/10.0/Developing/WSc3ff6d0ea77859461172e0811cbec0b2e1-7ff0.html

И этот раздел "Определение режима исполнения тег"

и попробуйте эквивалентный код режима проверить <cfswitch expression=#thisTag.ExecutionMode#>

Чтобы узнать, вызывает ли это другой код компилятора gen. Возможно, он будет генерировать код немного иначе, и переменная будет генерироваться.

Кроме того, еще один тест, который следует попробовать, - сначала поставить тег в «ThePage.cfm» и посмотреть, вызывает ли это другой код.

И, наконец, вы используете новый JVM, поскольку более новые используют последние функции Fork/Join для параллельного подхода Java, такие как Futures и т. Д., И они могут вызывать разные генерации кода. Возможно, установите JDK в более старый и посмотрите, отличается ли код.

Нет реального ответа, но некоторые вещи, на которые нужно смотреть.

+0

Спасибо Сэм. Я получил ответ на мой отчет об ошибке, подтверждающий, что это действительно ошибка. Поэтому, надеюсь, он будет исправлен в первом обновлении CF10. –

0

Я столкнулся с этим также.

Мое решение состояло в том, чтобы реорганизовать и поместить материал cfthread в .cfc и вызвать его с .cfm-страницы.