我有一个 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 没有?