2016-08-04 7 views
12

Я создал функцию doWork(), которая по расписанию запускать каждый день в 1:00 утра, функция выглядит следующим образом:Java Timer Service работает несколько раз

@Schedule(hour = "1", persistent = false) 
    public void doWork() 
    { 
     System.out.println("Starting .....\nTIME: " + System.currentTimeMillis()); 
     System.out.println("this : " + this); 

     //Some code here, if-conditions and try/catch blocks. No loops 

     System.out.println("Exiting .....\nTIME: " + System.currentTimeMillis()); 
     System.out.println("this : " + this); 
    } 

Проблема в том, что эта функция работает более чем один раз , а не по расписанию.

Как только я его создал, он работал точно так, как ожидалось (каждый день в 1:00:00 точно). Через несколько дней он начал работать в 1:03:00 (что не имеет никакого смысла, так как это непостоянно, и в любом случае на сервере не было простоя). После этого функция запускалась более одного раза с очень короткими интервалами между (разность секунд)

Кто-нибудь знает, что может вызвать это, или сообщите мне, что я могу сделать, чтобы исправить это?

[EDIT]: среда детали

Application Server: WebSphere Application Server 8.5.5

IDE: Rational Application Developer 9.1

Database Management System: IBM DB2 10,1

+3

Какой сервер приложений (и версия) вы используете? Это может помочь проверить, есть ли проблемы, связанные с этой AS. –

+0

Как вы записываете время службы? Выход журнала? Время системы/сервера? – kolossus

+0

@ OlivierGrégoire Я использую WebSphere Application Server 8.5.5 –

ответ

1

I что вы наблюдаете за контейнером, пытающимся повторить неудачный вызов doWork().

Служба таймера EJB является транзакционной.

Если выполнение метода тайм-аута выбрасывает любое исключение во время выполнения, транзакция будет отброшена назад, и контейнер попытается снова выполнить метод тайм-аута. См. §18.2.8. Транзакции спецификации EJB 3.1.

Кроме того, если истечет срок действия транзакции, некоторые реализации просто отметят текущую транзакцию для отката и продолжат обработку. Это приведет к сбою вызова таймера, и попытка повторения будет предпринята.

Этот механизм повторения недостаточно четко определен, и фактическое поведение варьируется от реализации до реализации. Некоторые вернутся навсегда, а другие будут сдаваться после нескольких попыток. Например, WebSphere предоставляет способ указания стратегии повтора. См. Creating timers using the EJB timer service for enterprise beans.

И наконец, если ваше приложение работает через несколько узлов, то, вероятно, у вас есть таймер, запущенный на экземпляр сервера. Согласно §18.2.3 непостоянным Таймерам в спецификации:

Для автоматических нестойких таймеров, контейнер создает новый непостоянный таймер во время инициализации приложения для каждого виртуальной машины Java, через которую распространяются контейнер.

Если все они выполняют одну и ту же задачу, это может вызвать достаточный хаос для генерации ошибок, откатов и последующих попыток.

+0

В соответствии с журналами метод doWork() запускается успешно в первый раз, затем он снова запускается и сбой и продолжает повторную попытку. Что происходит, так это то, что он принимает файл csv, анализирует его, удаляет все из базы данных и затем сохраняет анализируемые данные. Согласно журналам, с первой попытки база данных удаляется и повторно заполняется успешно, затем метод запускается снова и продолжает повторную попытку, и я получаю пустую базу данных. С первой попытки успешно, я не понимаю, почему метод будет вызван снова после первой попытки? –

+0

Вам все равно нужно предоставить более подробную информацию о вашей среде, прежде чем кто-либо сможет догадаться о ней. Кроме того, как вы можете быть уверены, что начальная транзакция завершилась успешно - т.е. после выхода 'doWork()'? –

+0

Я уверен, что он был успешно выполнен с первой попытки из-за регистрации. Проверяя журналы базы данных, я мог видеть, что записи из проанализированного CSV-файла были успешно сохранены в базе данных. Затем он повторяет попытку, удаляет все в базе данных, и я получаю пустую базу данных. И, пожалуйста, проверьте изменения для сведений об окружающей среде –

Смежные вопросы