在ColdFusion 10中的自定义标记中使用CFThread时出现未定义的错误

时间:2012-06-18 19:43:11

标签: coldfusion custom-tag coldfusion-10 cfthread

注意:我已完全重写此问题以考虑新信息。如果你已经通过这个,请重读。

在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

3 个答案:

答案 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)

丹,

请查看此页:

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

此部分&#34;确定标签执行模式&#34;

尝试等效模式检查代码<cfswitch expression=#thisTag.ExecutionMode#>

看看这是否会导致不同的编译器代码。也许它的生成代码会有所不同,变量会生成。

另外,另一个尝试的测试是将标记放在&#34; ThePage.cfm&#34;并查看是否会导致不同的代码生成。

最后,你是否使用较新的JVM,因为较新的JVM使用Java并发方法的最新Fork / Join功能,如Futures等,它们可能会导致不同的代码生成。也许将JDK设置为较旧的JDK,看看代码是否不同。

没有真正的答案,但有些事情要看。

答案 2 :(得分:0)

我也碰到了这个。

我的解决方案是重构并将cfthread的东西放入.cfc并从.cfm页面调用它。