Как я могу сделать Java-демон - PullRequest
7 голосов
/ 17 июня 2010

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

Ответы [ 2 ]

8 голосов
/ 17 июня 2010

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

ScheduledExecutorService Example (взят из 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);
    }
 }
4 голосов
/ 17 июня 2010

Адамс ответ прямо на деньги.Если вы в конечном итоге катитесь самостоятельно (вместо того, чтобы идти по кварцевому маршруту), вам захочется начать работу с 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>   

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...