多个模板同时运行

时间:2010-12-17 17:10:41

标签: coldfusion

我计划每10分钟运行一次coldfusion模板,当前一次运行超过10分钟时,如何防止它运行。

我已经尝试在应用程序范围内使用计数器变量,当模板超时或计数器错误没有减少时。

PS。是否有用于集成应用程序(后端内容)的coldfuison框架

2 个答案:

答案 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'分钟前。如果是,你可以假设上一个任务超时(或者出错...但在这种情况下,我认为你可以将一些错误处理放入任务本身)并运行任务的当前实例。