2016-05-16 10 views
0

Я использую библиотеку java.Util.Timer для расписания моей работы.Java Timer не работает на сервере 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:00. И перезапустил сервер в 10:40 утра в понедельник. Через 20 минут моя функция работала в 11:00, как и ожидалось. Но если я перезапущу свой сервер в четверг и установил начальное время, как в воскресенье, оно не срабатывало.

Есть ли какое-то время бездействия или время на сервере webshere? Что может быть причиной этого?

вот моя 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

В настройках конфигурации Java по умолчанию для websphere начинается неделя с воскресенья. В Турции неделя начинается с понедельника. Поэтому, когда я установил дату воскресенье в среду код:

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), поэтому его упоминание в этом ответе путается. Также поведение «Календарь» зависит от текущего по умолчанию JVM «Локаль». Итак, ваше первое предложение о «настройках по умолчанию java time, неделя начинается с воскресенья» является сбивающим с толку, поскольку нет никакой конфигурации по умолчанию. Или я неправильно понял? Я предлагаю отредактировать ответ, чтобы уточнить. –

+0

Я хочу подчеркнуть, что существует разница между временем java локального компьютера и временем Java-сервера. Причина этого в моем вопросе. Извините за мои условия. – neverwinter

1

Там не праздный резьбовой механизм убийства в WebSphere Application Server, так что не должно быть какой-либо причине таймер не работает. Я бы предложил взять дамп основного потока, чтобы увидеть, что ваш поток все еще запущен (возможно, сразу после его назначения) и, возможно, базовый дамп для проверки значений полей, чтобы обеспечить ожидаемые значения. Мое лучшее предположение было бы в том, что эта логика для запуска таймера на самом деле не работает по какой-то причине.

Сказали, почему вы используете java.util.Timer в первую очередь? Это не рекомендуется на любом сервере Java EE. Если вы используете WebSphere 8.0 или новее, я бы рекомендовал использовать запланированное время EJB, которое вы можете настроить с помощью синтаксиса cron. В противном случае, если обновление не является вариантом, я бы предложил использовать WebSphere Scheduler.