我计划每10分钟运行一次coldfusion模板,当前一次运行超过10分钟时,如何防止它运行。
我已经尝试在应用程序范围内使用计数器变量,当模板超时或计数器错误没有减少时。
PS。是否有用于集成应用程序(后端内容)的coldfuison框架
答案 0 :(得分:6)
使用名为cflock的独家:
<cflock
timeout = "#createTimeSpan(0,0,0,1)#"
name = "myProcess"
throwOnTimeout = "no"
type = "exclusive">
<cfset start = now()>
<!--- CFML to be synchronized. --->
<cfset interval = 10 * 60> <!--- 10 minutes in seconds --->
<cfif dateDiff("s", start, now()) GT interval>
<cfhttp url="yourtemplate.cfm">
</cfif>
</cflock>
这确保只有线程运行有问题的代码块。同时访问将在一秒内失败而不会出错。
如果先前超过时间间隔,则确保下一次运行被启动,跟踪锁内的开始时间,然后在结束时,如果超过时间间隔,则将cflock内的最后一个语句作为cfhttp调用本身。
答案 1 :(得分:1)
您可以探索的一条可能途径:
您可以设置数据库表来跟踪任务的进度。也许表名为“task”,列为“taskName”和“inProgress”,后者为布尔值。任务开始时,将inProgress设置为true。完成后,将inProgress设置为false。
在计划任务调用的模板中,首先检查指定任务的“inProgress”状态。如果是真的,那就中止吧。否则,继续。
编辑:
嗯......在超时或错误的情况下,实际上不会比应用程序变量更好。所以现在考虑使用时间戳而不是布尔值。当计划任务触发时,使用当前时间更新该值。完成后,将其清除。
因此,当任务再次启动时,它将看到前一个任务已完成(空值),或者它仍在进行中。 - 如果它仍在进行中,你可以对值进行dateDiff()以查看它是否超过'x'分钟前。如果是,你可以假设上一个任务超时(或者出错...但在这种情况下,我认为你可以将一些错误处理放入任务本身)并运行任务的当前实例。