0

我有一个 CF10 计划任务设置为每 2 分钟运行一次,但有时它需要更长的时间才能完成。我设置了一个应用程序变量,以防止在旧作业花费超过 2 分钟的情况下运行该作业。我不希望计划任务重叠。这似乎有效。这是我的计划任务的示例:

<cfoutput>
    Scheduled Task hit: #NOW()#<br />
</cfoutput>

<cfif NOT StructKeyExists(application,"BigJob")>
    <!--- Init the BigJob --->
    <cfset application.BigJob = { isProcessing = FALSE }>   
</cfif>

<!--- Is a BigJob already running? --->
<cfif application.BigJob.isProcessing>  
    <!--- yes it is, abort. --->
    <cfoutput>
        A BigJob is already in process.
    </cfoutput>

    <cfabort>
<cfelse>
    <!--- No it isn't, start processing. --->
    <cfset application.BigJob.isProcessing = TRUE>

    <cfoutput>
        Processing has begun: #NOW()#<br />
    </cfoutput>
</cfif>

<cfscript>

    // sleep for 15 seconds. To simulate processing.
    sleep(15000);

</cfscript>

<cfoutput>
    Scheduled Task complete: #NOW()#
</cfoutput>

<cfset application.BigJob.isProcessing = FALSE>

如果我在浏览器中点击它,我会得到以下输出:

计划任务命中:{ts '2013-05-10 16:02:10'}

处理已开始:{ts '2013-05-10 16:02:10'}

计划任务完成:{ts '2013-05-10 16:02:25'}

如果我在 5 秒后(第一个作业完成前 10 秒)在同一浏览器的另一个选项卡中再次点击它,我会得到:

计划任务命中:{ts '2013-05-10 16:02:25'}

处理已开始:{ts '2013-05-10 16:02:25'}

计划任务完成:{ts '2013-05-10 16:02:40'}

这表明 CF 在开始下一个请求之前等待一个请求完成(注意开始和结束时间)。

如果我在另一个浏览器中点击 CFM,在点击第一个浏览器 5 秒后,我会得到这个预期的输出:

计划任务命中:{ts '2013-05-10 16:02:18'}

BigJob 已在进行中。

我的问题是,CFSCHEDULER 似乎没有等待先前的请求完成。如果请求来自同一个浏览器,CF 确实会等待,但如果它来自计划任务,它似乎不会等待。在CF9中,我认为确实如此。

有没有更好的方法来防止计划任务在 CF10 中重叠?什么是阻止我的浏览器两次访问同一页面的东西的谷歌术语?我是否正确,CF9 确实等待前一个任务完成而 CF10 没有?

4

1 回答 1

3

在我的测试中,如果 ColdFusion 9 已经在运行,它不会执行任务。我创建了一个名为“test”的任务,它会休眠 4 分钟,但计划每 2 分钟运行一次。您可以在下面看到调度程序日志结果:

"Information","scheduler-2","05/10/13","14:34:00",,"[test] Executing at Fri May 10 14:34:00 PDT 2013"
"Information","scheduler-2","05/10/13","14:38:00",,"[test] Rescheduling for :Fri May 10 14:40:00 PDT 2013 Now: Fri May 10 14:38:00 PDT 2013"
"Information","scheduler-0","05/10/13","14:40:00",,"[test] Executing at Fri May 10 14:40:00 PDT 2013"
"Information","scheduler-0","05/10/13","14:44:00",,"[test] Rescheduling for :Fri May 10 14:46:00 PDT 2013 Now: Fri May 10 14:44:00 PDT 2013"
"Information","scheduler-3","05/10/13","14:46:00",,"[test] Executing at Fri May 10 14:46:00 PDT 2013"

每次,任务需要运行 4 分钟,然后在未来重新安排 2 分钟。所以运行之间的有效间隔实际上是 6 分钟。

这是我在正在执行的 CFM 页面中使用的代码:

<cfsetting requesttimeout="5000">
<cfscript>
    sleep(240000);
</cfscript>

以下是我使用的任务设置:

计划任务设置

如果您在 ColdFusion 10 中获得计划任务的重叠执行,那么正如@Leigh 所提到的,Ben Nadel 的<cflock>解决方案是一种防止这些重叠的简单方法。

于 2013-05-10T21:59:41.600 回答