【问题标题】:Why is CFTHREAD not running query and creating a file?为什么 CFTHREAD 不运行查询并创建文件?
【发布时间】:2014-12-11 06:39:23
【问题描述】:

我有一个检查文件日期的函数。如果文件大于 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>

【问题讨论】:

  • 您检查日志是否有错误?我怀疑不是。
  • 你知道我检查了 application.log 文件。我没有看到任何错误。即使我故意中断查询,如果它包含在 CFTHREAD 中,也不会出现错误。
  • 所有其他日志呢?就像异常日志一样。错误日志。甚至是输出日志!

标签: coldfusion cfthread


【解决方案1】:

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

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

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

有用的资源:

【讨论】:

  • 我认为亚当的帖子是正确的。我认为 Working with Threads 资源(就像大多数 Adob​​e 文档一样)有点糟糕。基本上,您告诉我的是线程中的每个范围都可用,但 LOCAL 范围除外。那是对的吗?如果是这样,我唯一需要传递给线程的是文件名(TheDailyFile)。嗯,那很容易。我会试试看。
  • @EvikJames 是的,我编辑了我的答案以涵盖这一点,虽然我的修复是如何快速演示如何做到这一点,但根据您提供的代码,您需要提供的只是一个变量.是的,除了本地范围之外,每个范围都应该可用。请求范围非常适合保存此类数据。
猜你喜欢
  • 2014-05-31
  • 1970-01-01
  • 1970-01-01
  • 2020-09-06
  • 2017-08-25
  • 2019-06-10
  • 1970-01-01
  • 2016-08-17
  • 1970-01-01
相关资源
最近更新 更多