2010-06-17 37 views
7

Web uygulamasında periyodik bir işlem yapmalıyım (java yöntemini çağır) (jcat on tomcat). Bunu nasıl yapabilirim? Java daemon veya başka çözümler?Java Daemon'u nasıl yapabilirim

+0

benzer gönderi http://stackoverflow.com/questions/3053936/how-to-execute-task-for-a-specific-period-in-java/3053971#3053971 –

cevap

8

Bir görevin düzenli olarak yürütülmesi için ScheduledExecutorService kullanabilirsiniz. Bununla birlikte, daha karmaşık cron benzeri bir programlamaya ihtiyacınız varsa, Quartz'a bir göz atın. Özellikle daha güzel bir API sağladığından ve işinizi ateşlemede kontrol etmenizi sağladığından, bu rotaya girerseniz Quartz in conjunction with Spring'u kullanmanızı tavsiye ederim.

(Javadoc alınan) ScheduledExecutorService Örnek

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

Ameliyatımın bitiş zamanı yok . Bunu her hafta, örneğin yapmalıyım. Bunu nasıl yapabilirim? – enfix

+0

Eğer ScheduledExecutorService kullanıyorsanız programWithFixedDelay veya scheduleAtFixedRate kullanmanız gerekir. Haftada bir kez ya da ayın belirli zamanlarında çalışan görevler için, çalışmanın tam olarak ne zaman yapılacağını tanımlayan basit bir cron ifadesi sağlayabildiğiniz için, Quartz'i tercih etme eğilimindeyim. – Adamski

4

Adams cevap doğru para olduğunu. Eğer kendi kendine yuvarlanıyorsanız (kuvars rotasına gitmek yerine), ServletContextListener numaralı telefondan bir şeyler atmak isteyeceksiniz. Burada, ScheduledExexutorPool'un aşağı yukarı bir sürümü olan java.util.Timer öğesini kullanarak bir örnek verilmiştir.

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

} 

Ve sonra bu düşünce için web.xml''deki

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

Sadece daha

yiyecek gidiyor!

İlgili konular