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

您不能写入本地范围并将其共享给单独的线程,您需要通过请求范围共享它们(请求是理想的范围,因为开发人员可以非常严格地控制其中包含的数据)。你可以尝试这样的事情:

在请求范围内创建一个结构并写入该结构。

公平地说,只有您需要传输的变量才需要在请求范围的结构中。这只是一个通用更新,因为我不知道您的 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 回答