9

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

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

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

提前致谢。

4

6 回答 6

13

做到这一点的唯一方法是为您的计划任务手动编辑文件。

所以:

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

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

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

希望有帮助!

于 2010-07-28T16:08:19.070 回答
6

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

于 2010-07-28T15:05:02.150 回答
2

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

于 2010-07-28T15:22:15.320 回答
1

我知道这是一个老问题了,但我一直回到这里,因为我需要一个类似的解决方案(仅对我来说是 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 29:30 F1E76BAE-C29A-208A-7B14339FD6B9B8D5 __ 2 - 书面信息 2013 年 2 月 26 日 15:30:00 F1E76BAE-C29A-208A-7B14339FD6B9B8D5 __ 3 - 书面信息 2013 年 2 月 26 日 15:30 15:30 -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 - 信息 2/6 /2013 15:32:00 F1F9B64D-C29A-208A-73CEACA04A02F544 __ 3 - 书面信息 02/26/2013 15:32:30 F1F9B64D-C29A-208A-73CEACA04A02F544 __ 4 - 书面信息 2013 年 2 月 26 日-F9A4 15:32:93 -73CEACA04A02F544 __ 完成 - 时间:90053 信息 02/26/2013 15:33:00 F20C0329-C29A-208A-79C8C0D4C1E1FDFF __ 开始信息 02/26/2013 15:33:00 F20C0329-C209A-208EFD-7信息 02/26/2013 15:33:30 F20C0329-C29A-208A-79C8C0D4C1E1FDFF __ 2 - 书面信息 02/26/2013 15:34:00 F20C0329-C29A-208A-79C8C0D4C1E1FDFF/6/02 - 书面信息15:34:30 F20C0329-C29A-208A-79C8C0D4C1E1FDFF __ 4 - 书面信息 02/26/2013 15:34:30 F20C0329-C29A-208A-79C8C0D4C1E1FDFF __ 完成 - 时间:90054 信息 02/25:2:00 F21E5001-C29A-208A-7702 __开始信息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-744291B2817D702 __4 信息/26/2013 15:36:30 F21E5001-C29A-208A-744291B2817D7702 __ 完成 - 时间:90029 信息 02/26/2013 15:37:00 F2309E2F-C29A-208A-7D6A5A2D1CA7D69EF __1/3 1:52/20 开始信息37:00 F2309E2F-C29A-208A-7D6A5A2D1CA7D9EF __ 1 - 书面信息 2013 年 2 月 26 日 15:37:30 F2309E2F-C29A-208A-7D6A5A2D1CA7D9EF __ 2 - 书面信息 2013 年 2 月 26 日 E92F-C8:23 -208A-7D6A5A2D1CA7D9EF __ 3 - 书面信息 2013 年 2 月 26 日 15:38:30 F2309E2F-C29A-208A-7D6A5A2D1CA7D9EF __ 4 - 书面信息 02/26/2013 15:38:30 F2309E2F-C29A-208A-7D6A5A2D1CA7D9EF __ 完成 - 时间:90013 信息 02/290/2013 ED34: -208A-7952DA25AF0C446D __ 开始信息 02/26/2013 15:39:00 F242ED34-C29A-208A-7952DA25AF0C446D __ 1 - 书面信息 02/26/2013 15:39:30 F242ED34-C29A-208A-7950C信息 02/26/2013 15:40:00 F242ED34-C29A-208A-7952DA25AF0C446D __ 3 - 书面信息 02/26/2013 15:40:30 F242ED34-C29A-208A-7952DA25AF0C446D __ 4/201 - 书面信息 02/ 15:40:30 F242ED34-C29A-208A-7952DA25AF0C446D __ 完成 - 时间:9004500 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 /26/2013 15:40:30 F242ED34-C29A-208A-7952DA25AF0C446D __ 完成 - 时间:9004500 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 /26/2013 15:40:30 F242ED34-C29A-208A-7952DA25AF0C446D __ 完成 - 时间:9004530 F242ED34-C29A-208A-7952DA25AF0C446D __ 4 - 书面信息 02/26/2013 15:40:30 F242ED34-C29A-208A-7952DA25AF0C446D __ 完成 - 时间:9004530 F242ED34-C29A-208A-7952DA25AF0C446D __ 4 - 书面信息 02/26/2013 15:40:30 F242ED34-C29A-208A-7952DA25AF0C446D __ 完成 - 时间:90045

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

于 2013-02-26T21:19:14.077 回答
1

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

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

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

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

于 2013-11-11T18:09:58.083 回答
0

<cfschedule>您正在寻找的标签,但请注意它是一个由两部分组成的标签。它是这样工作的:

<!--- 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

于 2012-07-06T18:25:17.183 回答