2010-06-17 35 views
7

Tôi cần thực hiện một thao tác định kỳ (gọi một phương thức java) trong ứng dụng web của tôi (jsp trên tomcat). Làm cách nào tôi có thể thực hiện việc này? Java daemon hoặc các giải pháp khác?Làm cách nào để tạo một Java Daemon

+0

bài đăng tương tự http://stackoverflow.com/questions/3053936/how-to-execute-task-for-a-specific-period-in-java/3053971#3053971 –

Trả lời

8

Bạn có thể sử dụng ScheduledExecutorService để thực hiện định kỳ tác vụ. Tuy nhiên, nếu bạn yêu cầu lịch trình cron phức tạp hơn thì hãy xem Quartz. Đặc biệt, tôi khuyên bạn nên sử dụng Quartz in conjunction with Spring nếu bạn đi xuống tuyến đường này, vì nó cung cấp API đẹp hơn và cho phép bạn kiểm soát công việc của mình trong cấu hình.

ScheduledExecutorService Ví dụ (lấy từ 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); 
    } 
} 
+0

Hoạt động của tôi không có thời gian kết thúc . Tôi cần thực hiện việc này, ví dụ: mỗi tuần. Làm cách nào tôi có thể thực hiện việc này? – enfix

+0

Nếu bạn đang sử dụng ScheduledExecutorService, bạn cần sử dụng scheduleWithFixedDelay hoặc scheduleAtFixedRate. Đối với các tác vụ chạy một lần mỗi tuần hoặc vào những thời điểm nhất định trong tháng, tôi có xu hướng ưu tiên Quartz, vì bạn có thể cung cấp biểu thức cron đơn giản trong cấu hình mô tả thời gian chính xác mà công việc sẽ chạy. – Adamski

4

Adams trả lời là ngay trên đồng tiền. Nếu bạn kết thúc việc lăn của riêng mình (thay vì đi tuyến đường thạch anh), bạn sẽ muốn khởi động mọi thứ trong một số ServletContextListener. Dưới đây là một ví dụ, bằng cách sử dụng java.util.Timer, đó là nhiều hơn hoặc ít hơn một phiên bản câm của 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); 
    } 

} 

Và sau đó này đi trong web.xml của bạn

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

Chỉ cần nhiều thức ăn cho các tư tưởng!

Các vấn đề liên quan