AS Я вас понимаю, вам нужно, чтобы ваше приложение запускалось каждые 20 минут. Чтобы рассчитать время начала, я создал вспомогательную функцию «getStartTime». С этим я могу использовать человекообразное время, например «23:30» (внимание, я из немецкого, так что это не для AM/PM, просто измените для своего необходимо).
Метод 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 час работа должна быть r un ... Я потратил несколько часов, но вам нужно вставить миллисекунды в конце, так что в течение 5 минут (вам нужно сделать 5 * 60 * 1000 миллисекунд.
Привет
EDIT в отношении к комментариям athors: Чтобы начать вещи на запуске приложения, у вас есть несколько методов. Один из способов - запустить сервлет при запуске, как это. Вставьте в 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 ...)
Теперь в сервлете вы определяете метод инициализации(), который автоматически вызывается, как это:
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);
}
}
};
Спасибо большое, но моя проблема заключается в том, что я не знаю, где и как назвать этот код, я» ve попытался с TimerTask, но как я могу сказать, чтобы мой сервер начал это автоматически? –
Я обновил свой ответ – GobiRan