2

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

cfthread在 ColdFusion 10 的自定义标签中使用 from 时出现错误。在应用程序日志中,我收到以下条目:

Variable _cffunccfthread_cfThreadTag2ecfm16902001291 is undefined.

它作为错误返回的函数的名称是_cffunccfthread_cf[Page Name Calling the CFThreadTag]一个不会随着请求而改变的数字。我每次都可以使用以下代码复制它:

应用程序.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>

为了验证任何地方都没有时髦的设置,这是我的本地开发环境的设置摘要

所以看起来如果我只是把线程扔出去,而不是等待它完成,那么线程似乎正在从父页面中寻找不再存在于内存中的东西。至少这是我完全没有根据的猜测:)。

我还向 Adob​​e 提交了一个错误。错误号 3218452

4

3 回答 3

2

我理解你的困境,但这里没有真正的问题

基本上你在 CF 中发现了一个错误。一些人——包括我自己——可以复制它。

没有人会遗漏任何东西,除了 Adob​​e 工程师在实施 CF10 时错过了在回归测试中包含此类内容。这不是对他们的起诉,真的,因为我认为这是合理的边缘情况,也许?

CF 找不到的“变量”实际上是 CF 编译器在编译代码时生成的已编译类的名称。对我来说似乎有一个编译器错误。

例如,我的错误是这样的: THREADTEST: Variable _cffunccfthread_cfThreadTag2ecfm13713410591 is undefined.

但是编译的类是: cfThreadTag2ecfm1371341059$func_CFFUNCCFTHREAD_CFTHREADTAG2ECFM13713410591.class

我不知道应该为变量命名的类名的哪一部分,但我怀疑它应该寻找func_CFFUNCCFTHREAD_CFTHREADTAG2ECFM13713410591. 或者另一方面,编译器不应该将 ThreadTag.cfm 文件编译为 FUNCTION?但我猜......它可能需要将线程代码编译为函数以便在单独的线程中调用它?这是一个猜测。无论哪种方式:它将代码编译为一件事,然后寻找另一件事。因为一个错误。

但这里的底线是:是的,你发现了一个错误。您已经使用 Adob​​e 对其进行了标记。我不知道你在这里还能做什么?

所以基本上我们现在知道不能<cfthread>在自定义标签中进行调用(我也通过<cfmodule>:相同的问题进行了测试)。您将不得不使用包含或方法或其他东西以不同的方式编写代码。不太理想,我知道,但你能做什么?

脚注:我查看了编译后的代码,看起来问题是 CF 正在编译带有该func_前缀的类,但它在其代码中引用它时没有。我没有一直遵循代码来检查正在发生的所有事情,但在我看来,似乎有对它的引用试图加载_cffunccfthread_cfThreadTag2ecfm13713410591而不是正确的名称:func_CFFUNCCFTHREAD_CFTHREADTAG2ECFM13713410591.class.

于 2012-06-20T12:59:22.567 回答
0

担,

请看这个页面:

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

而本节“确定标签执行模式”

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

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

此外,另一个要尝试的测试是将您的标签放在“ThePage.cfm”中,看看这是否也会导致不同的代码生成。

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

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

于 2012-06-23T13:32:22.310 回答
0

我也遇到了这个。

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

于 2013-04-23T15:36:20.933 回答