1

毎晩 10 万通の電子メールを数通送信するアプリケーションがあるため、処理を高速化するためにいくつかの cfthreads を追加しました。

これにより奇妙なエラーが発生し、あるスレッドで作成された変数が別のスレッドによって変更されていることがわかりました。私が読んだドキュメントから、あるスレッドで作成された変数はそのスレッドにのみ表示されるはずですか?

次のような簡単なテストを作成しました。

<cfthread
    name="thread1"
    action="run">

    <cfsavecontent variable="local.template_body">
        <cfinclude template="templates\6\2\bulletin_template.cfm">
    </cfsavecontent>

    <cfset tmpEmailBody = template_body>
</cfthread>

<cfthread
    name="thread2"
    action="run">

    <cffile action="append"
            file="C:\inetpub\error1.txt"
            output="#tmpEmailBody#">        
</cfthread>

「tmpEmailBody」の内容がファイルに正常に書き込まれます。

奇妙なことに、cfsavecontent セクションを削除して、: <cfset tmpEmailBody = "test">があると、2 番目のスレッドが発生し、予想どおり tmpEmailBody が定義されていないというエラーが発生します。

ここで何が起こっているか知っている人はいますか?

4

2 に答える 2

0

実行中の cfthread の目的が間違っていると思います。スレッド 2 の tmpEmailBody はスレッド 1 に依存しているようです。依存コードを別のスレッドで実行しないでください。

メーリングに関連するものとして cfthread をより適切に使用するには、

Thread1 { am のリストからメールが始まるデータベースからメールを選択 }

スレッド 2 { メールが nz から始まるデータベースからメールを選択} リスト nz から }

両方のスレッドが同時に実行されます。2 つのクエリは同時に実行できますが、変数を 1 つのスレッドに保存することはできず、別のスレッドで呼び出しのタイミングが一致することを期待します。

于 2012-11-12T20:01:52.033 に答える
0

変数は、スレッドに限定されたスコープではなくtmpEmailBody、スコープで作成されています。スレッドはランダムな順序とランダムな時間で実行されるため、最初の行を実行する前に最後の行を実行していないVariablesため、エラーが発生します。thread1thread2

cfthread を使用する場合、通常のスコープはすべてスレッド セーフではありません (ColdFusion リクエスト スレッド (別名ページ スレッド) に対してスレッド セーフであるのとは対照的に)。スレッド スコープを使用する必要があります。これは、ColdFusion ドキュメントのスレッド データの使用として公式に文書化されています。

私はあなたが2つのスレッドの外で宣言していると推測していたでしょうがtmpEmailBody、cfsetを静的文字列に変更すると期待される動作が得られるので、「問題」があり、スレッドローカルスコープではなくスコープにcfsavecontent書き込んでいると言えます。別のスコープの落とし穴Variablesとして提出する必要があります。

ColdFusion のドキュメントの例には少し足りない部分があるので、あるスレッドから別のスレッドに電子メール本文を渡したいかのようにコードを書き直します。これは意図した用途ではないと言いましたが、さまざまなスレッドスコープが表示されます。次のコードは、必要のないときに値を別のスコープにコピーしますが、別のスコープをより明確にするために行っています。そして、他の人が述べているように、以下のタスクはスレッドの不適切な使用です。

<cfthread
    name="thread1"
    action="run">

    <cfset var template_body = "">

    <cfsavecontent variable="template_body">
        <cfinclude template="templates\6\2\bulletin_template.cfm">
    </cfsavecontent>

    <cfset thread.tmpEmailBody = template_body>
</cfthread>

<cfthread action="join" name="thread1" timeout="60">

<cfset Variables.tmpEmailBody = cfthread["thread1"]tmpEmailBody>

<cfthread
    name="thread2"
    action="run"
    emailBody="#Variables.tmpEmailBody#">

    <cffile action="append"
            file="C:\inetpub\error1.txt"
            output="#Attributes.emailBody#">        
</cfthread>
于 2012-11-12T22:58:31.583 に答える