注意:我已经完全重写了这个问题以考虑新信息。如果您已经阅读过此内容,请重读。
我在使用 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. "
我还注意到,在自定义标记内的线程错误中,它不包含应用程序名称。而页面中线程的日志条目却如此。请注意,错误行只有 ,,
对于日志的应用程序列,而成功的线程有 "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 .
最佳答案
我理解您的困境,但这里没有实际的问题。
基本上你已经发现了 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
.
关于coldfusion - 在 ColdFusion 10 的自定义标签中使用 CFThread 时出现未定义错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11089901/