2

注:新しい情報を考慮して、この質問を完全に書き直しました。すでにこれを読んだことがある場合は、もう一度お読みください。

cfthreadColdFusion 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>

3つのファイルすべてをColdFusion10のディレクトリにドロップし、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タグ内のスレッドが処理を終了するのを待つように変更すると、すべてが正常に機能し、期待どおりにログに2つのエントリが取得されます。

<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

4

3 に答える 3

2

私はあなたの苦境を理解していますが、ここに実際の質問はありません。

基本的に、CFにバグが見つかりました。数人の人(私も含めて)がそれを複製できます。

CF10を実装する際の回帰テストにこの種のものを含めることを逃したAdobeエンジニアを除いて、誰も何も見逃していません。それは彼らの起訴ではありません、本当に、これは合理的にエッジケースだと思うので、おそらく?

検出されない「変数」CFは、実際には、CFコンパイラがコードをコンパイルするときに作成するコンパイル済みクラスの名前です。コンパイラのバグがあるようです。

たとえば、私のエラーは次のとおりです。 THREADTEST: Variable _cffunccfthread_cfThreadTag2ecfm13713410591 is undefined.

ただし、コンパイルされたクラスは次のとおりです。 cfThreadTag2ecfm1371341059$func_CFFUNCCFTHREAD_CFTHREADTAG2ECFM13713410591.class

変数の名前がクラス名のどの部分にあるのかわかりませんが、を探す必要があると思いfunc_CFFUNCCFTHREAD_CFTHREADTAG2ECFM13713410591ます。または、一方で、コンパイラはThreadTag.cfmファイルを関数としてコンパイルするべきではありませんか?しかし、私は推測しています...別のスレッドで呼び出すために、関数としてスレッドコードをコンパイルする必要があるかもしれませんか?それは推測です。いずれにせよ、コードを1つのものとしてコンパイルしてから、別のものを探します。バグのため。

しかし、ここでの結論:うん、あなたはバグを見つけた。そして、あなたはそれをアドビでフラグを立てました。私はあなたがここで他に何をするべきかわからないのですか?

<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#>

これにより別のコンパイラコード生成が発生するかどうかを確認します。多分それは少し異なるコードを生成し、変数が生成されます。

また、試行するもう1つのテストは、「ThePage.cfm」の最初にタグを配置し、それによって別のコード生成が発生するかどうかを確認することです。

最後に、新しいJVMを使用していますか?新しいJVMは、FuturesなどのJava同時実行アプローチの最新のFork / Join機能を使用しており、異なるコード生成を引き起こしている可能性があります。たぶん、JDKを古いものに設定して、コード生成が異なるかどうかを確認してください。

本当の答えはありませんが、注意すべき点がいくつかあります。

于 2012-06-23T13:32:22.310 に答える
0

私もこれに出くわしました。

私の解決策は、cfthreadのものをリファクタリングして.cfcに入れ、それを.cfmページから呼び出すことでした。

于 2013-04-23T15:36:20.933 に答える