Как запустить службу в определенное время с помощью приложения JSP / Servlets? - PullRequest
4 голосов
/ 09 июня 2010

Я занимаюсь разработкой приложения JSP / Servlets и хочу запустить службу в определенное время, например:

За каждый день в 10:00 утра удаляйте любые вложение из таблицы «вложение» в базе данных, где столбец X == NULL.

Как я могу сделать это в приложении JSP / Servlets? Я использую Glassfish в качестве сервера.

Ответы [ 3 ]

4 голосов
/ 09 июня 2010

Вы работаете на сервере Java EE Glassfish, поэтому у вас должен быть доступ к службе EJB Timer.

Вот пример:

http://java -x.blogspot.com / 2007/01 / EJB-3-таймер-service.html

Я использовал предыдущую версию API на JBoss, и это работало нормально.

В настоящее время мы склонны бросать Quartz на войне и использовать его для выполнения по времени, поэтому он также работает на наших экземплярах разработки для Jetty

3 голосов
/ 09 июня 2010

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

Вот базовый пример:

public class Config implements ServletContextListener {

    private ScheduledExecutorService scheduler;

    public void contextInitialized(ServletContextEvent event) {
        scheduler = Executors.newSingleThreadScheduledExecutor();
        scheduler.scheduleAtFixedRate(new Task(), millisToNext1000, 1, TimeUnit.DAYS);
    }

    public void contextDestroyed(ServletContextEvent event) {
        scheduler.shutdown();
    }

}

Где Task реализует Callable и millisToNext1000 - количество миллисекунд до следующих 10:00. Вы можете использовать Calendar или JodaTime для его вычисления. В качестве альтернативы, отличной от стандарта Java, вы также можете использовать Quartz .

1 голос
/ 09 июня 2010

Инвентарь ServletContextListener;в методе contextInitialized:

ServletContext servletContext = servletContextEvent.getServletContext();
try{
 // create the timer and timer task objects
  Timer timer = new Timer();
  MyTimerTask task = new MyTimerTask(); //this class implements Callable.

 // get a calendar to initialize the start time
  Calendar calendar = Calendar.getInstance();
 Date startTime = calendar.getTime();

  // schedule the task to run hourly
 timer.scheduleAtFixedRate(task, startTime, 1000 * 60 * 60);

  // save our timer for later use
  servletContext.setAttribute ("timer", timer);
} catch (Exception e) {
 servletContext.log ("Problem initializing the task that was to run hourly: " + e.getMessage ());
}

Отредактируйте файл web.xml, чтобы иметь ссылку на реализацию прослушивателя:

<listener>
   <listener-class>your.package.declaration.MyServletContextListener</listener-class>
</listener>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...