我将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没有?
答案 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>
以下是我使用的任务设置:
如果您在ColdFusion 10中获得计划任务的重叠执行,那么正如@Leigh所提到的,Ben Nadel's <cflock>
solution是防止这些重叠的简单方法。