注意:我已完全重写此问题以考虑新信息。如果你已经通过这个,请重读。
在ColdFusion 10中的自定义标记内使用cfthread
时出现错误。在应用程序日志中,我收到以下条目:
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 :(得分: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>
进行了测试:同样的问题)。你将不得不以不同的方式编写你的代码,使用包含或方法或其他东西。我知道,不太理想,但你能做什么?
脚注:
我查看了编译后的代码,看起来问题是CF正在用func_
前缀编译类,但它在代码中没有引用它。我没有按照代码一直检查所发生的一切,但它看起来像是有引用它试图加载_cffunccfthread_cfThreadTag2ecfm13713410591
而不是正确的名称:func_CFFUNCCFTHREAD_CFTHREADTAG2ECFM13713410591.class
。
答案 1 :(得分:0)
丹,
请查看此页:
此部分&#34;确定标签执行模式&#34;
尝试等效模式检查代码<cfswitch expression=#thisTag.ExecutionMode#>
看看这是否会导致不同的编译器代码。也许它的生成代码会有所不同,变量会生成。
另外,另一个尝试的测试是将标记放在&#34; ThePage.cfm&#34;并查看是否会导致不同的代码生成。
最后,你是否使用较新的JVM,因为较新的JVM使用Java并发方法的最新Fork / Join功能,如Futures等,它们可能会导致不同的代码生成。也许将JDK设置为较旧的JDK,看看代码是否不同。
没有真正的答案,但有些事情要看。
答案 2 :(得分:0)
我也碰到了这个。
我的解决方案是重构并将cfthread的东西放入.cfc并从.cfm页面调用它。