Как я могу сделать Демона Java

Я должен сделать периодическую операцию (назовите метод Java) в моем веб-приложении (jsp на коте). Как я могу сделать это? Демон Java или решения других?

7
задан skaffman 18 June 2010 в 09:01
поделиться

2 ответа

Вы можете использовать ScheduledExecutorService для периодического выполнения задачи. Однако, если вам требуется более сложное cron-подобное планирование, обратите внимание на Quartz. В частности, я бы рекомендовал использовать Quartz в сочетании с Spring, если вы пойдете по этому пути, так как он предоставляет более приятный API и позволяет вам управлять запуском заданий в конфигурации.

Пример ScheduledExecutorService (взято из Javadoc)

 import static java.util.concurrent.TimeUnit.*;
 class BeeperControl {
    private final ScheduledExecutorService scheduler =
       Executors.newScheduledThreadPool(1);

    public void beepForAnHour() {
        final Runnable beeper = new Runnable() {
                public void run() { System.out.println("beep"); }
            };
        final ScheduledFuture<?> beeperHandle =
            scheduler.scheduleAtFixedRate(beeper, 10, 10, SECONDS);
        scheduler.schedule(new Runnable() {
                public void run() { beeperHandle.cancel(true); }
            }, 60 * 60, SECONDS);
    }
 }
8
ответ дан 6 December 2019 в 21:10
поделиться

Ответ Адамса прямо на деньгах. Если вы в конечном итоге откатываете свой собственный (вместо того, чтобы идти по кварцевому пути), вы захотите начать работу с ServletContextListener . Вот пример использования java.util.Timer, который является более или менее тупой версией ScheduledExexutorPool.

public class TimerTaskServletContextListener implements ServletContextListener
{
   private Timer timer;

   public void contextDestroyed( ServletContextEvent sce )
   {
      if (timer != null) {
         timer.cancel();
      }
   }

   public void contextInitialized( ServletContextEvent sce )
   {
      Timer timer = new Timer();
       TimerTask myTask = new TimerTask() {
         @Override
         public void run()
         {
            System.out.println("I'm doing awesome stuff right now.");
         }
      };

      long delay = 0;
      long period = 10 * 1000; // 10 seconds;
      timer.schedule( myTask, delay, period );
  }

}

А потом это помещается в ваш web.xml

<listener>
   <listener-class>com.TimerTaskServletContextListener</listener-class>
 </listener>   

Еще больше пищи для размышлений!

4
ответ дан 6 December 2019 в 21:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: