2016-05-16 17 views
0

私の仕事をスケジュールするためにjava.Util.Timerライブラリを使用しています。WebsphereサーバーでJavaタイマーが起動しない

毎週日曜日に22:00に私の機能を呼びたいと思っています。私はそのコードを展開し、木曜日にWebSphereサーバーを再起動し

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); 

:だから私のコードは次のようです。私はその機能が日曜に始まると予想していました。しかし、それは発砲しなかった。サーバーにエラーまたはログアウトがありません。

私は月曜日午前11時と開始時刻を更新

ことを試みました。そして、午前10時40分にサーバーを再起動しました。 20分後、私の機能は期待通りに午前11時に働いた。しかし、木曜日にサーバーを再起動し、日曜日に起動時間を設定しても起動しない場合は、

webshereサーバにアイドル状態のスレッドが終了するか、sth elseがありますか? この理由は何でしょうか?ここ

は私のstartScheduler機能は、WebSphere Application Serverでのメカニズムを殺すアイドルスレッドがありませんので、タイマーが実行されないいかなる理由があってはならない

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時間構成では、週はsundayで始まります。トルコでは週が月曜日から始まります。だから私は、コードによって水曜日日曜日に日付を設定する場合:

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

それは私の地元の次の日曜日に設定が、WebSphereで、それは前の日曜日に設定します。

設定した開始日が現在の日付よりも小さい場合、タイマー機能は起動しません。ライブラリ制限です。だから私はあなたが[ `java.util.Calendar`]の動作に言及しているわけではない(http://docs.oracle.com/javase/8/docs/api/java

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

ように私の問題を修正しました/util/Calendar.html)クラス?それは特に[WebSphere](https://en.wikipedia.org/wiki/IBM_WebSphere)とは何の関係もないので、この回答の中の言及は混乱しています。また、 'Calendar'の動作は、JVMの現在のデフォルトの' Locale'に依存します。ですから、デフォルトの設定がないため、「デフォルトのjava時間設定、週は日曜日から始まります」という最初の文は混乱します。それとも私は誤解したことがありますか?明確にするために回答を編集することをお勧めします。 –

+0

私は、ローカルコンピュータのjava時間とサーバーのjava時間の間に違いがあることを強調したいと思います。理由は私の質問のためです。申し訳ありません。 – neverwinter

1

です。あなたのスレッドがまだ実行中である(おそらく、スケジュールされた直後)、おそらくフィールド値を検査して期待値があることを確認するためのコアダンプを確認するためにコアスレッドダンプを取ることをお勧めします。私の最高の推測は、タイマーを開始するこのロジックは、実際に何らかの理由で実行されていないということです。

それでは、なぜjava.util.Timerを最初に使用していますか?これはJava EEサーバーではお勧めできません。 WebSphere 8.0以降を使用している場合は、EJBスケジュール時間を使用することをお勧めします。これはcronのような構文で構成できます。それ以外の場合、アップグレードがオプションでない場合は、WebSphere Schedulerを使用することをお勧めします。

関連する問題