CF10 CFSCHEDULER重叠

时间:2013-05-10 20:35:58

标签: coldfusion scheduled-tasks

我将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,在点击第一个CFM后5秒,我会得到这个预期的输出:

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

BigJob已在进行中。

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

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

1 个答案:

答案 0 :(得分: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>

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

Scheduled Task Settings

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