2013-05-10 55 views
0

我有一個CF10計劃任務設置爲每2分鐘運行一次,但有時需要比完成更長的時間。我設置了一個應用程序變量來防止作業在較早的作業花費超過2分鐘的時間內運行。我不希望計劃的任務重疊。這似乎工作。這是我的計劃任務的例子:CF10 CFSCHEDULER重疊

<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年5月10日16:02: 10' }

處理已經開始:{TS '2013年5月10日16時02分10秒'}

計劃任務完成:{TS「2013年5月10日16時02分: 25'}

如果我再次打在同一個瀏覽器的另一個選項卡5秒鐘後,10秒內的第一份工作完成之前,我得到這個:

計劃任務命中:{TS「2013年5月10日16 :02:25' }

處理已經開始:{TS '2013年5月10日16時02分25秒'}

計劃任務完成:{TS「2013年5月10日16 :02:40'}

這表明CF在開始下一個請求之前等待一個請求完成(請注意開始和結束時間)。

如果我打的是CFM在不同的瀏覽器5秒命中的第一個後,我得到這個預期輸出:

計劃任務命中:{TS「2013年5月10日16時02分18秒'}

BigJob已在處理中。

我的問題是,它看起來好像CFSCHEDULER不等待先前的請求完成。如果請求來自同一個瀏覽器,CF會等待,但是如果它來自計劃任務,CF似乎不會等待。在CF9中,我認爲它確實如此。

有沒有更好的方法來防止計劃任務在CF10中重疊?什麼是阻止我的瀏覽器兩次打同一頁的東西的谷歌術語?我是否正確地認爲CF9確實等待之前的任務完成,而CF10沒有?

+1

我不能停留在周圍,但關於重疊 - 你看到這個博客條目..? [確保計劃任務不會在ColdFusion中重疊](http://www.bennadel.com/blog/%E2%80%8B1844-Making-Sure-Scheduled-Tasks-Don-t-Overlap) – Leigh 2013-05-10 20:59:36

+0

Thanks Leigh,是的,我做到了。該解決方案似乎比我的應用程序變量解決方案更優雅。但是,我希望隨着CF10調度程序的所有變化,Adobe都能夠真正解決這個問題。 – 2013-05-10 21:08:58

回答

3

在我的測試中,如果ColdFusion 9已經運行,它不執行任務。我創建了一個名爲「測試」的任務,睡了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是防止這些重疊的簡單方法。