Неопределенная ошибка при использовании 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>

И чтобы убедиться, что нигде нет странных настроек, вот моя сводка настроек локальной среды разработки.

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

Я также сообщил об ошибке в Adobe. номер ошибки 3218452.


person Dan Short    schedule 18.06.2012    source источник
comment
Опубликуйте код, который выполняется в методе AddLog Server.Utilities.Logger.   -  person Shawn Holmes    schedule 19.06.2012
comment
Также опубликуйте полный исходный код функции UpdatePropertyStats()   -  person Shawn Holmes    schedule 19.06.2012
comment
UpdatePropertystats — это не функция, это имя потока. Я добавил содержимое функции, которая вызывается потоком.   -  person Dan Short    schedule 19.06.2012
comment
Там должно быть что-то еще. Выполняется в CF9, Информация, cfthread-0,06/19/12,07:41:06,CFTHREADCUSTOMTAGTEST,Поток на странице успешно выполнил информацию,cfthread-1,06/19/12,07:41:07,CFTHREADCUSTOMTAGTEST ,Поток внутри тега успешно запущен ```   -  person Bradley Moore    schedule 19.06.2012
comment
Я вижу те же записи журнала в ColdFusion 8. Но я не думаю, что вы можете сделать более простой пример, чем приведенный выше, и у меня это происходит на трех отдельных установках ColdFusion 10.   -  person Dan Short    schedule 19.06.2012
comment
Загрузил CF10 и у меня там тоже работает. Если вы перезапустите службу, у вас все еще есть проблема?   -  person Bradley Moore    schedule 19.06.2012
comment
Перезапуск сервера приложений не приводит к изменению поведения. Я предположил, что это может быть связано с тем, что CF работает под отдельной учетной записью службы, но две из моих систем, выполняющих это, работают под учетной записью локальной системы в службах, а третья работает под отдельной учетной записью службы.   -  person Dan Short    schedule 19.06.2012
comment
Взгляните на ограничения ваших тем в админке CF. Возможно ли, что они установлены настолько низко, что вы не можете запустить второй поток?   -  person Mark A Kruger    schedule 19.06.2012
comment
Я хочу... У меня максимальное количество потоков, доступных для CFTHREAD, установлено на 100. Как я показал с изменением, чтобы добавить JOIN внутри тега. Если я подожду, пока он закончит, так и будет. Если я этого не сделаю, то и не будет (эй, я сочинил рифму!!!).   -  person Dan Short    schedule 19.06.2012
comment
Дэн... это действительно глючит - но удивительно... Я ожидаю, что здесь все еще есть что-то, чего не видно - какая-то проблема с масштабом, которая мучает нас.   -  person Mark A Kruger    schedule 19.06.2012
comment
Да, очень глючит. Я пробовал это как с JVM, который поставляется с CF10, так и с u32, который мне все равно нужно использовать для совместимости с драйвером MS SQL JDBC. Боюсь, для этого мне придется обратиться непосредственно в Adobe, так как, похоже, никто не может воспроизвести проблему.   -  person Dan Short    schedule 19.06.2012


Ответы (3)


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

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

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

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

Например, моя ошибка такова: THREADTEST: Variable _cffunccfthread_cfThreadTag2ecfm13713410591 is undefined.

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

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

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

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

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

person Adam Cameron    schedule 20.06.2012
comment
Изначально был вопрос, по сути, я сумасшедший???. Но на данный момент я согласен, это ошибка, и у меня есть несколько человек, которые воспроизвели ее (спасибо!). Я видел ту же проблему, используя cfmodule. На данный момент я извлек код потока в CFC и вызвал метод CFC из пользовательского тега. Это прекрасно работает, поскольку поток затем вызывается в контексте CFC, а не исходного пользовательского тега. - person Dan Short; 20.06.2012
comment
Ах, тогда ладно. Тогда, чтобы ответить на ваш актуальный вопрос: по крайней мере, на основании доказательств, которые вы здесь представляете: вы не сумасшедший. Однако дальнейшие доказательства вполне могут противоречить этому ;-) - person Adam Cameron; 20.06.2012
comment
Вы получаете голос за это за то, что дали мне презумпцию сомнения :). Я также отмечаю это как ответ, поскольку он одновременно подтверждает ошибку и помогает описать основную причину проблемы (насколько нам известно). - person Dan Short; 20.06.2012

Дэн,

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

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 на более старый и посмотрите, отличается ли генератор кода.

Нет реального ответа, но есть на что посмотреть.

person Sam Griffith Jr.    schedule 23.06.2012
comment
Спасибо, Сэм. Я получил ответ на свой отчет об ошибке, подтверждающий, что это действительно ошибка. Так что, надеюсь, это будет исправлено в первом обновлении CF10. - person Dan Short; 23.06.2012

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

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

person johnfallen    schedule 23.04.2013