【问题标题】:How can I run a ColdFusion scheduled task at an interval <60 seconds?如何以 <60 秒的间隔运行 ColdFusion 计划任务?
【发布时间】:2011-03-22 05:05:43
【问题描述】:

我有一个 CFC 方法,我想以 30 秒的间隔运行。但是,问题是 ColdFusion 不允许我安排以 60 秒或更短的时间间隔运行的任务。有没有人对我如何(并且应该)完成这个有什么建议?

为了抢先回答“当您的脚本运行时间超过 30 秒时会发生什么”或任何其他类似问题,我已经考虑了所有这些问题,这不是问题。

我在 Windows Server 2003 (IIS6) 上运行 ColdFusion 8.0.1(带修补程序 4)。附带说明一下,我使用 Java 1.6u21 作为 ColdFusion 的 JVM。

提前致谢。

【问题讨论】:

    标签: coldfusion scheduled-tasks cfc coldfusion-8


    【解决方案1】:

    执行此操作的唯一方法是手动编辑您计划任务的文件。

    所以:

    1. 以 5 分钟的间隔创建计划任务。
    2. 在 CF 安装的 lib 目录中打开名为 neo-cron.xml 的文件。您可能需要先备份
    3. 搜索计划任务的名称。它是一大块 XML,因此您可能希望对其进行格式化并在 XML 编辑器中搜索它。
    4. 在任务名称之后您应该会看到类似这样的内容:&lt;var name="interval"&gt;&lt;string&gt;300&lt;/string&gt;&lt;/var&gt;。这是任务运行之间的秒数。在这里只需几秒钟,因此您可以手动将其调整为 30,然后保存文件并关闭它。

    这仍将在 CF 管理员中显示为 1 分钟,但应每 30 秒运行一次 - 如果您愿意,请添加日志记录以证明这一点!

    并不是说如果您使用 CF 管理员编辑任何其他计划任务,您的手动更改将不受影响,但如果您编辑手动调整的实际任务,它将覆盖您的更改。

    希望有帮助!

    【讨论】:

    • cfschedule 标签也可以完成类似的技巧,但至少 CF9 在第一次执行后擦除了这个任务——所以我认为解决方案无效。
    • 这真是太棒了!我不知道你能做到这一点。谢谢!
    【解决方案2】:

    您可以使用 curl 并在服务器 Win 或 nix 上安排任务。

    【讨论】:

    • 这是我最初的想法之一。我不会完全排除它,但如果可能的话,我宁愿把所有东西都保存在 CF 中。感谢您的回答。
    【解决方案3】:

    您真的对每分钟运行两次的任务感兴趣,还是只是希望减少检测更改或新数据时的延迟?如果是后者,您可以考虑使用 CF 事件网关来准确检测何时运行。如果是这种情况,您的服务器上的流失率就会大大降低,因为您会在发生某些事件时立即运行该 CFC 方法,而不仅仅是无休止地轮询数据。

    【讨论】:

    • 此应用程序需要查询多个数据源并不断更新信息以显示在用 Flex 编写的客户端上。不幸的是,事件网关不符合要求,尽管我认为它们是一个非常酷的功能。
    【解决方案4】:

    我知道这是一个老问题,但我一直回到这里,因为我需要一个类似的解决方案(仅对我来说是 10 秒的间隔),但这些答案都没有奏效。我今天终于找到了一种方法,我想我会发布以防万一有人最终陷入类似的困境。

    我发现我无法使用作为答案列出的 xml 修改方法,因为我们使用的是 CF 9.0.1,并且 xml 在我更改后几乎会立即恢复。

    我尝试查看 cURL,发现虽然我可以使用 cURL 来调用进程,但我也无法让 windows 调度程序在不到一分钟的时间间隔内运行。然后,在寻找一种让 Windows 调度程序以更小的间隔运行的方法时(因为我认为此时我无法欺骗 CF),我偶然发现了关于专家交流的建议(我不记得关闭的 url现在交)。

    在此基础上,我使用这个想法设置了一个测试:添加另一层程序,调用您要调度的程序。让这一层循环进入睡眠状态,并将其安排为超过一分钟的时间间隔。最终,我执行了一个 CF 计划任务,该任务每 2 分钟调用一次我的“调用者”,并且该“调用者”有一个每 X 秒休眠一次的循环。

    以下是我用于测试的代码,其格式是为了回答提问者的 30 秒间隔。我利用一个侧面日志管理 cfc 以一种我可以保存和重新访问的方式输出调试。

    计划每 2 分钟运行一次的测试文件:

    <cfsetting requestTimeOut = "120000">
    
    <cfscript>
        /*  Get starting count to keep track of overall running time */
        Start = GetTickCount();
    
        /*  Set an ID for this process so I know */
        thisProcess = CreateUUID();
        counter = 0;
    
        /*  Set up a log-file-handler object.
        *   I will use the log lines to keep track of this process 
        *   and whether or not it steps on itself.
        * */
        LogWriter = CreateObject('component','log.LogMgr').init('C:\Logs\');
        LogFile = 'Test\30SecondTestLog';
    
        LogWriter.WriteToLog('Information',LogFile,'#thisProcess# __ Started');
    </cfscript>
    
    <cftry>
        <cfloop condition="Counter LT 4">
    
            <!--- Output here is if you want to run it manually --->
            <br /><cfdump var="#counter#">
    
            <!---   Here you could put a cfhttp or similar trigger.
                    In my test I just used an update to a test DB table.
                    The catch here is that you don't want it to take too
                    long to get to the next steps, so you want to avoid
                    a long-running process that has to return something.
                    --->
            <cfquery datasource="Marge" name="update">
                Update test..testCount
                Set CountField = CountField + 1
            </cfquery>
    
            <cfscript>
                 counter += 1;
                 LogWriter.WriteToLog('Information',LogFile,'#thisProcess# __ #counter# - Written');
    
                 /* Important part! Here is where the 30-second delay 
                 *  happens. However, we don't want to dally if this is
                 *  the last time running it.
                 *  */
                 if(counter NEQ 4){ sleep(30000); }
            </cfscript>
    
        </cfloop>
    
        <!--- Time to output finishing details --->
        <br />Done. <br />
    
        <cfset End = GetTickCount()>
        <cfdump var="#End - Start#">
    
        <cfset LogWriter.WriteToLog('Information',LogFile,'#thisProcess# __ Done - Time: #End - Start#')>
    
    <cfcatch type="any">
        <cfset LogWriter.WriteToLog('Error',LogFile,'#thisProcess# __ #counter# - #cfcatch.message#')>
    </cfcatch>
    </cftry>
    

    用于调试的日志记录cfc:

    <cfscript>
        variables.LogHome = '';
    </cfscript>
    
    <cffunction name="init" raturntype="LogMgr">
        <cfargument name="LogHome" type="string">
        <cfset variables.LogHome = arguments.LogHome>
        <cfreturn this>
    </cffunction>
    
    <!--- I wanted to use WriteLog, but that function name is already used in core CF --->
    <cffunction name="WriteToLog" returntype="void" hint="writes to a log file.">
        <cfargument name="LogType" type="string" hint="Based off cflog, expects severity level: Information, Warning, Error, or Fatal">
        <cfargument name="LogPath" type="string" hint="Path and file from log root">
        <cfargument name="LogString" type="string" hint="String to output in log">
        <cfscript>
    
        theFile = variables.LogHome & '\' & arguments.LogPath & '.log';
        theString = arguments.LogType & chr(9) & DateFormat(Now(),'mm/dd/yyyy')& ' ' & TimeFormat(Now(),'HH:mm:ss');
        theString &= '  ' & arguments.LogString;
    
        </cfscript>
        <cfif FileExists(theFile)>
            <cffile action="append"
                    file="#theFile#"
                    output="#theString#"
                    addnewline="yes">
        <cfelse>
            <cffile action="write"
                    file="#theFile#"
                    output="#theString#"
                    addnewline="yes">
        </cfif>
    </cffunction>
    
    </cfcomponent>
    

    测试在安排了十分钟的窗口时给出了这个日志输出:

    信息 02/26/2013 15:29:00 F1E76BAE-C29A-208A-7B14339FD6B9B8D5 __ 开始 信息 02/26/2013 15:29:00 F1E76BAE-C29A-208A-7B14339FD6B9B8D5 __ 1 - 书面 信息 02/26/2013 15:29:30 F1E76BAE-C29A-208A-7B14339FD6B9B8D5 __ 2 - 书面 信息 02/26/2013 15:30:00 F1E76BAE-C29A-208A-7B14339FD6B9B8D5 __ 3 - 书面 信息 02/26/2013 15:30:30 F1E76BAE-C29A-208A-7B14339FD6B9B8D5 __ 4 - 书面 信息 02/26/2013 15:30:30 F1E76BAE-C29A-208A-7B14339FD6B9B8D5 __ 完成 - 时间:90123 信息 02/26/2013 15:31:00 F1F9B64D-C29A-208A-73CEACA04A02F544 __ 开始 信息 02/26/2013 15:31:00 F1F9B64D-C29A-208A-73CEACA04A02F544 __ 1 - 书面 信息 02/26/2013 15:31:30 F1F9B64D-C29A-208A-73CEACA04A02F544 __ 2 - 书面 信息 02/26/2013 15:32:00 F1F9B64D-C29A-208A-73CEACA04A02F544 __ 3 - 书面 信息 02/26/2013 15:32:30 F1F9B64D-C29A-208A-73CEACA04A02F544 __ 4 - 书面 信息 02/26/2013 15:32:30 F1F9B64D-C29A-208A-73CEACA04A02F544 __ 完成 - 时间:90053 信息 02/26/2013 15:33:00 F20C0329-C29A-208A-79C8C0D4C1E1FDFF __ 开始 信息 02/26/2013 15:33:00 F20C0329-C29A-208A-79C8C0D4C1E1FDFF __ 1 - 书面 信息 02/26/2013 15:33:30 F20C0329-C29A-208A-79C8C0D4C1E1FDFF __ 2 - 书面 信息 02/26/2013 15:34:00 F20C0329-C29A-208A-79C8C0D4C1E1FDFF __ 3 - 书面 信息 02/26/2013 15:34:30 F20C0329-C29A-208A-79C8C0D4C1E1FDFF __ 4 - 书面 信息 02/26/2013 15:34:30 F20C0329-C29A-208A-79C8C0D4C1E1FDFF __ 完成 - 时间:90054 信息 02/26/2013 15:35:00 F21E5001-C29A-208A-744291B2817D7702 __ 开始 信息 02/26/2013 15:35:00 F21E5001-C29A-208A-744291B2817D7702 __ 1 - 书面 信息 02/26/2013 15:35:30 F21E5001-C29A-208A-744291B2817D7702 __ 2 - 书面 信息 02/26/2013 15:36:00 F21E5001-C29A-208A-744291B2817D7702 __ 3 - 书面 信息 02/26/2013 15:36:30 F21E5001-C29A-208A-744291B2817D7702 __ 4 - 书面 信息 02/26/2013 15:36:30 F21E5001-C29A-208A-744291B2817D7702 __ 完成 - 时间:90029 信息 02/26/2013 15:37:00 F2309E2F-C29A-208A-7D6A5A2D1CA7D9EF __ 开始 信息 02/26/2013 15:37:00 F2309E2F-C29A-208A-7D6A5A2D1CA7D9EF __ 1 - 书面 信息 02/26/2013 15:37:30 F2309E2F-C29A-208A-7D6A5A2D1CA7D9EF __ 2 - 书面 信息 02/26/2013 15:38:00 F2309E2F-C29A-208A-7D6A5A2D1CA7D9EF __ 3 - 书面 信息 02/26/2013 15:38:30 F2309E2F-C29A-208A-7D6A5A2D1CA7D9EF __ 4 - 书面 信息 02/26/2013 15:38:30 F2309E2F-C29A-208A-7D6A5A2D1CA7D9EF __ 完成 - 时间:90013 信息 02/26/2013 15:39:00 F242ED34-C29A-208A-7952DA25AF0C446D __ 开始 信息 02/26/2013 15:39:00 F242ED34-C29A-208A-7952DA25AF0C446D __ 1 - 书面 信息 02/26/2013 15:39:30 F242ED34-C29A-208A-7952DA25AF0C446D __ 2 - 书面 信息 02/26/2013 15:40:00 F242ED34-C29A-208A-7952DA25AF0C446D __ 3 - 书面 信息 02/26/2013 15:40:30 F242ED34-C29A-208A-7952DA25AF0C446D __ 4 - 书面 信息 02/26/2013 15:40:30 F242ED34-C29A-208A-7952DA25AF0C446D __ 完成 - 时间:90045

    我希望这可以帮助其他无法获得其他答案的人!

    【讨论】:

      【解决方案5】:

      没有足够的代表评论Ciaran Archer 的答案,所以我把它放在这里:

      正如Kodora 指出的那样,使用ColdFusion 9.0.1(在我的情况下为9.0.1.274733)更改将不会立即生效,并且似乎需要重新启动服务。但是,在重新启动时,您对 neo-cron.xml 文件的更改会丢失!

      要解决此问题,请务必在对文件进行更改之前停止 ColdFusion 服务。服务停止后,您可以进行调整,保存文件并重新启动服务。

      值得注意的是,在 Windows Server 2008 R2(可能更高版本)上,您可能需要以管理员身份打开记事本,然后从记事本中打开 neo-cron.xml 文件。否则,您可能无法保存对文件的更改(我相信是因为 UAC)。

      【讨论】:

        【解决方案6】:

        &lt;cfschedule&gt; 您要查找的标签,但请注意,它是由两部分组成的标签。它的工作原理是这样的:

        <!--- creates/updates the scheduled task you are going to run --->
        <cfschedule action="update" task="testing" interval="seconds" operation="HTTPRequest" startdate="7/6/2012" starttime="11:06 AM" URL="yoursite.com">
        
        <!--- runs the task you just updated (the part that makes the task repeat on your specified interval instead. If you do not include this, the task will run only once as it did in @sergii's case--->
        <cfschedule action="run" task="testing">
        

        文档位于:http://livedocs.adobe.com/coldfusion/8/htmldocs/help.html?content=Tags_r-s_11.html

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-11-21
          • 1970-01-01
          • 1970-01-01
          • 2017-10-22
          • 2011-07-05
          • 1970-01-01
          • 2011-04-15
          • 1970-01-01
          相关资源
          最近更新 更多