2016-02-29 2 views
1

Мне нужно выполнить задачу каждые 5 минут на моем сервере, чтобы обновить некоторые данные на db, я обнаружил, что в openshift у меня есть cron, который выполняет какой-либо скрипт каждый момент времени. Возможно ли создать сценарий, который делает простой вызов сервлета или java-кода для запуска этой работы? Я довольно новичок в программировании на стороне сервера, поэтому, пожалуйста, говорите легко!Openshift cron execute servlet - Запланированное задание

Ps. Я использую Tomcat 6 (Jboss EWS 1.0), сервер mySQL 5.5

ответ

1

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); 
     } 
    } 
}; 
+0

Спасибо большое, но моя проблема заключается в том, что я не знаю, где и как назвать этот код, я» ve попытался с TimerTask, но как я могу сказать, чтобы мой сервер начал это автоматически? –

+0

Я обновил свой ответ – GobiRan

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