1

ファイルの日付をチェックする関数があります。ファイルが 60 秒を超える場合は、クエリを実行して新しいファイルを作成する必要があります。クエリの実行には 60 秒かかります。

このプロセスは、CFTHREAD でラップされていない場合に完全に機能します。CFTHREAD を使用すると、何も起こらないようです。エラーは発生しません。私が期待しているのは、作成中の新しいファイルです。その新しいファイルを見ることはありません。

どこでエラーを探す必要がありますか? 私は何が欠けていますか?CFTHREAD が機能しないのはなぜですか?

<!--- GET CATEGORIES --->
<cffunction name="getCategories" access="remote">
    <cfscript>
        LOCAL.MaxFileAge = 60;
        LOCAL.MaxFileUnits = 's';

        // THE FILE
        LOCAL.TheFileDaily = "#VARIABLES.JSDir#\#VARIABLES.DayMonth#-categories.json";

        // THE FILE DOES NOT EXIST
        if (fileExists(LOCAL.TheFileDaily) == false) {
            LOCAL.MakeNewFile = true;
        // THE FILE EXISTS
        } else {
            // GET THE DATE OF THE FILE
            LOCAL.LastModified = getFileInfo(LOCAL.TheFileDaily).LastModified;
            // GET FILE AGE
            LOCAL.FileAge = dateDiff(LOCAL.MaxFileUnits, LOCAL.LastModified, now());
            // FILE IS OLD
            if (LOCAL.FileAge > LOCAL.MaxFileAge) {
                LOCAL.MakeNewFile = true;
            } else {
                LOCAL.MakeNewFile = false;
            }
        }
    </cfscript>
    <cfif LOCAL.MakeNewFile eq true>
        <cfthread action="run" priority="HIGH">
            <cfquery name="Q">
                SELECT  Stuff
                FROM    Tables
            </cfquery>
            <!--- MAKE THE DAILY FILE --->
            <cffile action="write" file="#LOCAL.TheFileDaily#" output="#serializeJSON(Q)#">
        </cfthread> 
    </cfif>
</cffunction>
4

1 に答える 1

3

ローカルスコープに書き込んで別のスレッドに共有することはできません。リクエストスコープを介して共有する必要があります(開発者は含まれるデータを非常に厳密に制御できるため、リクエストは理想的なスコープです)。次のようなことを試してみてください:

request スコープ内に構造体を作成し、それに書き込みます。

公平を期すために、転送する必要がある変数のみがリクエストスコープの構造体にある必要があります。CFTHREAD の内容が実際にどのように見えるかがわからないため、これは単なる一般的な更新です。この場合、実際には TheFileDaily が共有している唯一の変数であるように見えるため、リクエスト スコープ内にある必要があるのはそれだけです。

<!--- GET CATEGORIES --->
<cffunction name="getCategories" access="remote">
    <cfscript>
        request.lData = StructNew();
        request.lData.MaxFileAge = 60;
        request.lData.MaxFileUnits = 's';

        // THE FILE
        request.lData.TheFileDaily = "#VARIABLES.JSDir#\#VARIABLES.DayMonth#-categories.json";

        // THE FILE DOES NOT EXIST
        if (fileExists(request.lData.TheFileDaily) == false) {
            request.lData.MakeNewFile = true;
        // THE FILE EXISTS
        } else {
            // GET THE DATE OF THE FILE
            request.lData.LastModified = getFileInfo(request.lData.TheFileDaily).LastModified;
            // GET FILE AGE
            request.lData.FileAge = dateDiff(request.lData.MaxFileUnits, request.lData.LastModified, now());
            // FILE IS OLD
            if (request.lData.FileAge > request.lData.MaxFileAge) {
                request.lData.MakeNewFile = true;
            } else {
                request.lData.MakeNewFile = false;
            }
        }
    </cfscript>
    <cfif request.lData.MakeNewFile eq true>
        <cfthread action="run" priority="HIGH">
            <cfquery name="Q">
                SELECT  Stuff
                FROM    Tables
            </cfquery>
            <!--- MAKE THE DAILY FILE --->
            <cffile action="write" file="#request.lData.TheFileDaily#" output="#serializeJSON(Q)#">
        </cfthread> 
    </cfif>
</cffunction>

有用な情報源:

于 2014-12-10T21:53:08.690 に答える