2016-05-16 66 views
0

我正在使用java.Util.Timer庫來安排我的工作。Java定時器不會在Websphere服務器上啓動

我想在每個星期天的22:00打電話給我的功能。所以我的代碼是這樣的:

rspServer = new RSPServer(); 

Calendar scheduleStartTime = Calendar.getInstance(); 
scheduleStartTime.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY); 
scheduleStartTime.set(Calendar.HOUR_OF_DAY, 22); 
scheduleStartTime.set(Calendar.MINUTE, 0); 
scheduleStartTime.set(Calendar.SECOND, 0); 
scheduleStartTime.set(Calendar.MILLISECOND, 0); 

rspServer.startScheduler(Class.forName("xx.xx.xx.xx.RSP.RSPServer"),rspServer, "PopulateModels", scheduleStartTime, 7 * 24 * 60 * 60 * 1000); 

我在週四部署了該代碼並重新啓動了websphere服務器。我期待這個功能將在星期日開始。但它並沒有開火。服務器中沒有錯誤或輸出日誌。

我試過

我在星期一上午11點更新了開始時間。並在星期一上午10點40分重新啓動服務器。 20分鐘後,我的功能如預期在11:00工作。但是如果我在星期四重新啓動服務器並將開始時間設置爲星期日,則不會觸發。

在webshere服務器中是否有一種空閒線程kill time或sth else? 這可能是什麼原因?

這裏是我的startScheduler功能

public void startScheduler(final Class<?> serverClass, final Object server, 
     final String methodName, Calendar _startAfterTime, int _repeatAfterTime) { 
    timer = new Timer(); 
    TimerTask timerTask = new TimerTask() { 
     private java.lang.reflect.Method method; 

     @Override 
     public void run() { 
      try { 
       method = serverClass.getMethod(methodName); 
       method.invoke(server); 
      } catch (Exception e) { 
       // TODO Auto-generated catch block 
       System.err.println("Error!"); 
       e.printStackTrace(); 
      } 
     } 
    }; 
    timer.schedule(timerTask, _startAfterTime.getTime(), _repeatAfterTime); 
} 

回答

0

在websphere默認的java時間配置​​中,本週從星期日開始。在土耳其,週一從星期一開始。所以,當我通過代碼設置日期至週日在週三:

scheduleStartTime.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY); 

它設置下週日在我的地方,但在WebSphere它設置一個星期日。

在定時器功能中,如果您設置的開始日期小於當前日期,則定時器功能不會觸發。這是圖書館的限制。所以我固定我的問題一樣

Calendar scheduleStartTime = Calendar.getInstance(); 
scheduleStartTime.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY); 
scheduleStartTime.set(Calendar.HOUR_OF_DAY, 11); 
scheduleStartTime.add(Calendar.DAY_OF_YEAR, 7); // added this line to set next sunday 
scheduleStartTime.set(Calendar.MINUTE, 0); 
scheduleStartTime.set(Calendar.SECOND, 0); 
scheduleStartTime.set(Calendar.MILLISECOND, 0); 
+0

你是不是指的['java.util.Calendar']行爲(http://docs.oracle.com/javase/8/docs/api/java /util/Calendar.html)類?這與[WebSphere](https://en.wikipedia.org/wiki/IBM_WebSphere)沒有任何關係,因此在本答覆中提及的內容很混亂。此外,Calendar的行爲取決於JVM當前的默認'Locale'。因此,關於「默認java時間配置​​,這周開始於星期日」的第一句話令人困惑,因爲沒有一個默認配置。或者我誤解了?我建議編輯答案來澄清。 –

+0

我想強調本地計算機java時間和服務器java時間之間的區別。原因是我的問題。對不起,我的條款。 – neverwinter

1

有WebSphere Application Server中沒有空閒線程殺菌機制,所以不應該有任何理由定時器不運行。我會建議採取一個核心線程轉儲來查看您的線程是否仍在運行(可能是在計劃之後立即執行),也可能是檢查字段值以確保它們具有預期值的核心轉儲。我最好的猜測是這個啓動定時器的邏輯實際上並不是由於某種原因運行的。

這就是說,你爲什麼首先使用java.util.Timer?這在任何Java EE服務器中都不推薦。如果您使用的是WebSphere 8.0或更高版本,我會推薦使用EJB預定時間,您可以使用類似cron的語法進行配置。否則,如果升級不是一個選項,我會建議使用WebSphere Scheduler。