2016-02-29 76 views
1

我需要每隔5分鐘在我的服務器上執行一個任務來更新數據庫上的一些數據,我發現在openshift上我有每次都執行一些腳本的cron。是否可以製作一個腳本來簡單調用一個servlet或一個java代碼來運行這個工作? 我對服務器端編程相當陌生,所以請說簡單!Openshift cron執行servlet - 預定作業

Ps。我正在使用Tomcat 6(Jboss EWS 1.0),mySQL 5.5服務器

回答

1

據我所知,你需要你的應用程序每隔XX分鐘運行一次。 爲了計算開始時間我做了一個輔助函數「getStartTime」由於我可以使用人類可讀的時間,如「23:30」(注意,我來自德語,所以它不適用於上午/下午,只是改變你的需要)。

helper方法:

private static long getStartTime(String startTime) { 
    int hour = Integer.parseInt(startTime.split(":")[0]); 
    int minutes = Integer.parseInt(startTime.split(":")[1]); 
    Calendar cal = Calendar.getInstance(); 
    Date dateNow = cal.getTime(); 
    cal.set(Calendar.HOUR_OF_DAY, hour); 
    cal.set(Calendar.MINUTE, minutes); 
    cal.set(Calendar.SECOND, 0); 

    if(cal.getTime().before(dateNow)) { 
     cal.set(Calendar.DAY_OF_MONTH, cal.get(Calendar.DAY_OF_MONTH) + 1); 
     return cal.getTime().getTime(); 
    } else { 
     return cal.getTime().getTime(); 
    } 
} 

現在你可以使用ScheduledExecutorService的從Java。例如:

ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1); 

    long startClearRequests = getStartTime(DEFAULT_JOB_START_TIME) - System.currentTimeMillis(); 

,並設置您需要到scheduleAtFiexed率:

scheduledExecutorService.scheduleAtFixedRate(clearRequests, startClearRequests, Math.round(DEFAULT_JOB_PERIOD_HOURS * 60 * 60 * 1000), TimeUnit.MILLISECONDS); 

例如筆者使用的:

private static final int NUM_OF_THREADS = 2; 
    private static final String DEFAULT_JOB_START_TIME = "23:30"; 
    private static final double DEFAULT_JOB_PERIOD_HOURS = 24; 

正如你看到的,你可以改變線程數(取決於你的應用程序正在做什麼),開始時間(這只是應用程序啓動所需的時間(第一次啓動作業的時間) 並且期間(每XX小時工作應該un ...我花了幾個小時,但你需要在最後插入毫秒,所以5分鐘(你必須達到5 * 60 * 1000毫秒。

問候

編輯在對於athors評論: 要啓動在應用程序啓動的事情,你有幾種方法。一種方法是像這樣在啓動時啓動一個servlet。插入web.xml中

<servlet> 
    <servlet-name>ServletStartups</servlet-name> 
    <servlet-class>model.initialization.ServletStartups</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

這將調用在應用程序啓動(在負載上的啓動是優先級的數量級ServletStartups,因爲你可以有多個條目,可以決定首先啓動(1 ,2,3 ...)

現在你的servlet中,你定義init()方法,該方法被自動調用,這樣的:

public class ServletStartups extends HttpServlet{ 


public void init() throws ServletException{ 
    // HEre you can put your methods as described above  //(scheduledExecutorService(... 

} 

}

IMPORTA NT注意:上面的 我有一個方法「clearRequests」,對不起,這是我的方法,我沒有重新命名它在這裏添加它。該方法將每隔24小時在我的應用程序中調用。

您從ScheduledExecutorService的調用的方法必須是一個可調用的,就像這樣:

private Runnable clearRequests = new Runnable() { 

    public void run() { 
     try { 
      // Here do your task 
     } catch (Exception e) { 
      throw new RuntimeException(e); 
     } 
    } 
}; 
+0

非常感謝,但我的問題是,我不知道在哪裏以及如何調用這個代碼,我我試過用TimerTask,但我怎麼能說我的服務器自動啓動它? –

+0

我更新了我的答案 – GobiRan