Coldfusion 为什么CFTHREAD没有运行查询并创建文件?

Coldfusion 为什么CFTHREAD没有运行查询并创建文件?,coldfusion,cfthread,Coldfusion,Cfthread,我有一个功能,应该检查一个文件的日期。如果文件大于60秒,则应运行查询并创建新文件。查询运行需要60秒 当这个过程没有被包装在CFTHREAD中时,它可以完美地工作。当使用CFTHREAD时,似乎什么也没有发生。我没有错误。我希望看到的是,一个新的文件正在制作中。我从来没见过那个新文件 我应该在哪里查找错误?我错过了什么?为什么CFTHREAD不起作用 <!--- GET CATEGORIES ---> <cffunction name="getCategories" acce

我有一个功能,应该检查一个文件的日期。如果文件大于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>

您不能向单独的线程写入本地作用域并将其共享给单独的线程,您需要通过请求来共享本地作用域。对于这一点,请求是理想的作用域,因为开发人员可以非常严格地控制其中包含的数据。您可以尝试以下方法:

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

公平地说,只有需要传输的变量才需要在请求范围的结构中。这只是一个普通的更新,因为我不知道CFTHREAD的内容到底是什么样子的。在本例中,实际上看起来FileDaily是您共享的唯一变量,因此这将是请求范围中唯一需要的变量

<!--- 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>
有用的资料来源:


你有没有检查日志中的错误?我想没有。你知道我检查了application.log文件。我看不出有错误。即使我故意中断查询,如果它被包装在CFTHREAD中,也不会显示错误。那么所有其他日志呢?比如异常日志。错误日志。甚至输出日志!我认为亚当的帖子很贴切。我认为与大多数Adobe文档一样,使用线程资源有点糟糕。基本上,您要告诉我的是,线程中的每个作用域都是可用的,本地作用域除外。对吗?如果是这样的话,我需要传递到线程中的唯一内容就是DailyFile的文件名。嗯,那很容易。我会尝试一下。@EvikJames是的,我编辑了我的答案来说明这一点,虽然我的修复程序只是一个如何实现它的快速演示,但根据您提供的代码,您只需要提供一个变量即可。是的,除了本地范围之外,每个范围都应该可用。请求范围正好适合保存此类数据。