2011-08-06 21 views
13

Tôi tương đối mới đối với Java và tôi đã chọn một dự án để làm việc. Tuy nhiên, tôi đã chạy vào một khối. Tôi cần một phương pháp để chạy vào một thời điểm nhất định trong ngày. Tôi đã thực hiện khá nhiều tìm kiếm nhưng tôi không thể tìm thấy bất cứ điều gì có vẻ như nó sẽ làm các trick. Tôi đã chạy vào lớp Timer nhưng nó xuất hiện để chạy trong khoảng thời gian nhất định. Lớp Scheduler, dường như có cùng một vấn đề. Tôi cũng bắt gặp Quartz nhưng tôi nghĩ tôi cần thứ gì đó nhẹ hơn và tôi chỉ có thể thấy cách làm mọi thứ trong khoảng thời gian.Chạy một phương thức Java vào một thời điểm định sẵn mỗi ngày

Có lẽ, chỉ vì tôi mới, tôi đã bỏ lỡ một số điều có thể giúp tôi trong các lớp học này, nhưng tôi thực sự bị mắc kẹt và có thể sử dụng một số trợ giúp.

Nếu ai đó có thể chỉ cho tôi một lớp học sẽ chạy vào một thời điểm nào đó trong ngày, hàng ngày (điểm thưởng để có thể hủy sự kiện) và chỉ cho tôi cách sử dụng đúng lớp, điều đó thật tuyệt vời !

TL; DR: Cần một lớp học làm điều gì đó vào thời điểm trong ngày, không phải trong một khoảng thời gian vì chương trình có thể được khởi động lại nhiều lần trong ngày.

+2

Tôi đã viết một bài đăng tải lại điểm này. Điều này có thể giúp bạn: http://harryjoy.wordpress.com/2011/07/09/create-a-scheduler-task-in-java/ –

+0

@ Harry Joy hữu ích. Tôi không biết về Quartz –

Trả lời

26

thử lớp TimerTask

để biết thêm kiểm tra http://oreilly.com/java/archive/quartz.html

import java.util.Calendar; 
import java.util.Date; 
import java.util.Timer; 
import java.util.TimerTask; 

public class ReportGenerator extends TimerTask { 

    public void run() { 
    System.out.println("Generating report"); 
    //TODO generate report 
    } 

} 

class MainApplication { 

    public static void main(String[] args) { 
    Timer timer = new Timer(); 
    Calendar date = Calendar.getInstance(); 
    date.set(
     Calendar.DAY_OF_WEEK, 
     Calendar.SUNDAY 
    ); 
    date.set(Calendar.HOUR, 0); 
    date.set(Calendar.MINUTE, 0); 
    date.set(Calendar.SECOND, 0); 
    date.set(Calendar.MILLISECOND, 0); 
    // Schedule to run every Sunday in midnight 
    timer.schedule(
     new ReportGenerator(), 
     date.getTime(), 
     1000 * 60 * 60 * 24 * 7 
    ); 
    }//Main method ends 
}//MainApplication ends 
+3

+1: Tôi cũng thích thạch anh. Nhưng sử dụng nó và bắt đầu nhiệm vụ với cron làm cho nó trách nhiệm của bạn rằng các ứng dụng không bao giờ bị treo, tự động khởi động lại nếu nó vẫn treo, vv – Daniel

+2

Lưu ý rằng điều này bị hỏng sau khi thay đổi trong DST! Bộ hẹn giờ sau đó sẽ chạy một giờ trễ hoặc nhanh, tại đây lúc 1 giờ sáng hoặc 11 giờ tối (tùy thuộc vào việc nó được bắt đầu vào mùa hè và chuyển tiếp sang mùa đông hay ngược lại). – Philipp

+0

Tôi đã thêm date.set (Calendar.AM_PM, Calendar.AM); hoặc PM để làm cho nó hoạt động đúng lúc tôi mong đợi. –

4

Tôi thực sự khuyên bạn nên sử dụng trình quản lý lịch biểu của hệ điều hành của bạn: ví dụ: "cron" trong * nix hoặc "công cụ lập lịch biểu" trong Windows .

+0

Tôi sẽ đề nghị thứ hai đó. Tại sao reimplement tất cả mọi thứ, và lo lắng về việc quản lý các ứng dụng Java ở tất cả? @Eegabooga bạn có thực sự _need_ điều này trong Java không? Các giải pháp nhẹ có thể được thực hiện nếu bạn cần chúng, nhưng nó đang tái phát triển rất nhiều và có khả năng sẽ không mạnh mẽ. –

+0

Cảm ơn tất cả các bạn đã trả lời. Tuy nhiên, tôi gần như chắc chắn 100% rằng điều này cần phải nằm trong Java. Nó không phải là chương trình cần khởi chạy lại vào một thời điểm nhất định hàng ngày, đó là một hành động mà chương trình thực hiện. Ngay cả khi cron có thể làm điều này, chương trình này không phải dành cho tôi mà là một người khác. Những gì tôi đang làm là một plugin cho một máy chủ trò chơi và các plugin móc vào máy chủ của anh chàng này. Nếu có thể, tôi có thể gửi cho anh ta các tệp cron anh ta cần nếu bạn nghĩ điều này có hiệu quả, nhưng hãy nhớ tôi cần một phương thức để chạy trong chương trình, chứ không phải chương trình đó là tự (xin lỗi nếu cú ​​pháp sai, vẫn đang học) –

+0

Ok tôi thấy bây giờ mà tôi có thể chạy một cronjob thông qua Java với Quartz. –

2

Một khả năng có thể được sử dụng một lịch trình bên ngoài - tùy thuộc vào độ chính xác mong muốn. Trên UNIX sử dụng CRON, trên Windows sử dụng Windows Scheduler. Điều đó độc đáo cô lập thời gian từ làm.

Bạn có thể sử dụng Bộ hẹn giờ và tạo một lớp đơn giản kiểm tra thời gian mỗi phút hoặc 5 phút tùy thuộc vào độ chi tiết mong muốn. Nó sẽ rất nhẹ.

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