我需要每隔5分鐘在我的服務器上執行一個任務來更新數據庫上的一些數據,我發現在openshift上我有每次都執行一些腳本的cron。是否可以製作一個腳本來簡單調用一個servlet或一個java代碼來運行這個工作? 我對服務器端編程相當陌生,所以請說簡單!Openshift cron執行servlet - 預定作業
Ps。我正在使用Tomcat 6(Jboss EWS 1.0),mySQL 5.5服務器
我需要每隔5分鐘在我的服務器上執行一個任務來更新數據庫上的一些數據,我發現在openshift上我有每次都執行一些腳本的cron。是否可以製作一個腳本來簡單調用一個servlet或一個java代碼來運行這個工作? 我對服務器端編程相當陌生,所以請說簡單!Openshift cron執行servlet - 預定作業
Ps。我正在使用Tomcat 6(Jboss EWS 1.0),mySQL 5.5服務器
據我所知,你需要你的應用程序每隔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);
}
}
};
非常感謝,但我的問題是,我不知道在哪裏以及如何調用這個代碼,我我試過用TimerTask,但我怎麼能說我的服務器自動啓動它? –
我更新了我的答案 – GobiRan