2012-06-09 99 views
3

是否有任何Cronjob的JavaScript替代品?Javascript替代CronJob

事情是,我的老闆不想再使用CronJob進行日常執行,並告訴我,如果我們可以用javascript而不是CronJob來做。

我寫了一個php + javascript代碼。它基本上從數據庫中收集日常任務數據(執行哪個.php文件,時間間隔等),並將它們放入一個對象中。

然後,

<script> 
    function mainFunc(){  
     for(var i=0; i<sizeOfJobs(); i++){ //traverse in the object 
      currentDate = new Date(); 
      //if any of the jobs execution time has come, execute it   
      if(jobs[i]['next_run'] <= currentDate){ 
       $.ajax({ 
        url: jobs[i]['file_location'] , 
        async: false, //this is another question, look below please 
        success: function(data){ 
         //after the finish, set next_run and last_run     
         currentDate = new Date();      
         jobs[i]['last_run'] = currentDate; 
         var nextRun = new Date(); 
         nextRun.setTime(currentDate.getTime() + (jobs[i]['interval'] * 60 * 1000)); 
         jobs[i]['next_run'] = nextRun;       

        } 
       });    
      }      
     } 
     //repeat 

     //currently 10 sec but it will increase according to jobs max runtime   
     setTimeout(mainFunc,10000); 
    } 


     $(document).ready(function(){ 
      setTimeout(mainFunc,10000);   
     }) 
</script> 

所以,我用這個代碼。它適用於基本工作,但會有大量工作需要10分鐘以上才能完成(如刪除並重新填充具有數千行的分表)

  • 安全嗎?
  • 我應該將「async」值設置爲false嗎?
  • 我知道的情況,有可能是其在同一時間執行工作,如果我設置異步假,每一項工作需要等待完成以前的工作等等,所以我需要設置的setTimeout值所有作業的總最大運行時間。
  • 如果我確定了它會發生什麼?我的擔心是,如果某個作業在setTimeout時間間隔之前無法完成,則next_run將不會被設置,並且會自動重新執行。那麼我應該在ajax調用之前設置next_run的值嗎?

回到正題,我應該需要做的這一切?有更好的解決方案或庫嗎? (我用Google搜索,但沒有找到什麼有用的東西。)

謝謝

+0

setInterval(fun_here,30000); ? HTTP://計算器。com/questions/4695629/cron-job-but-for-jquery-javascript –

+0

是的,我在發佈這個問題之前看到它,但不幸的是它並沒有解決我的問題。 – dhargan

+11

我很想知道這是否可行......但我更感興趣的是想知道爲什麼你的老闆看起來很不願意使用cron:一個可靠的,隨時可用的工作調度程序。特別是因爲你提到你將執行像db截斷/插入等服務器端操作,好像他在爲你編織一個痛苦的世界:o –

回答

1

首先,在我的專業意見,你的老闆是瘋狂的:)

話雖如此,這裏的一些變化,你可以讓來解決你的恐懼:

  1. 創建的job_execution_slots與相同長度的jobs數組的數組;初始化爲null值。

  2. 在你做$.ajax()之前,你需要檢查job_execution_slots[i]是否被「取走」(而不是null)。

  3. 當插槽爲空時,請執行job_execution_slots[i] = $.ajax({...})並確保它設置爲async: true;保持引用也允許你通過停止AJAX請求來「殺死」一個作業。

  4. 在你的AJAX完成處理你job_execution_slots[i] = null;

這基本上每個序列化作業的執行。

讓我知道這對你是否有意義;我可以根據需求提供更多細節:)

+0

'async:true'是默認的 – ThiefMaster

+1

@ThiefMaster它也取決於'$ .ajax'全局設置,所以我總是要求確保:)順便說一句,祝你在選舉中好運,你做得非常好! –

+0

實際上它被使用了3天:D我在服務器機器上運行了這段代碼(使用async:false。它有點慢但代碼更安全)迄今爲止效果很好。我相信在時機到來的時候會爆炸,但我已經警告過該公司。無論如何,我無法相信我寫下了一個JavaScript任務調度器。我不確定這是一個成就還是失敗:D感謝您的建議,但這真是一個好主意。也許我會在維護時間到來時應用這個。 – dhargan