2013-02-13 39 views
7

Điều này sẽ khá thẳng về phía trước, nhưng tôi thấy không có công việc nào được thực thi. Tôi có một điểm ngắt trên phương thức execute() của nhiệm vụ, không có luồng nào được đưa vào đó. Tôi không hiểu sai.Quartz không kích hoạt trình kích hoạt đơn giản

các Job

class Printer implements Job{ 
    public Printer(){ 
     System.out.println("created printer"); 
    } 

    @Override 
    public void execute(JobExecutionContext context) 
      throws JobExecutionException { 
     System.out.println("hi" + context.getFireTime()); 
    } 

} 

Các lớp học chính

class MyClass { 
     public static void main(String[] args) throws Throwable { 
      Scheduler s = StdSchedulerFactory.getDefaultScheduler(); 
      JobDetail job = newJob(Printer.class).build(); 
      CronTrigger trigger = 
        newTrigger() 
        .withIdentity("a", "t") 
        .withSchedule(cronSchedule("0/5 * * * * ?").inTimeZone(TimeZone.getDefault())) 
        .forJob(job).build(); 
      s.scheduleJob(job, trigger); 

// This prints the right date! 

      System.out.println(trigger.getNextFireTime()); 
      s.start(); 
     } 
} 

EDIT: Tôi phát hiện ra tôi không có tập tin quartz.property, vì vậy có khả năng threadpool cho thạch anh là chưa bao giờ được tạo. Vì vậy là đã đọc trong documentation, tôi thay thế các mã sử dụng StdSchedulerFactory như sau:

DirectSchedulerFactory.getInstance().createVolatileScheduler(10); 
Scheduler s = DirectSchedulerFactory.getInstance().getScheduler(); 

Đoán những gì? Không may mắn. Hiệu ứng giống hệt nhau. Ứng dụng giữ ở lại còn sống, bắn không kích hoạt.

+1

Chương trình của bạn không kết thúc? – Dariusz

+0

Không vì tôi không tắt lịch trình (có mục đích). – sscarduzio

+0

Bạn có thực sự xác nhận rằng ứng dụng của bạn không chỉ kết thúc ngay sau 's.start()'? – Dariusz

Trả lời

9

Tôi tìm thấy giải pháp: thay đổi mức hiển thị của lớp xác định công việc (Máy in) thành công khai sẽ làm cho Quartz có thể truy cập và chạy nó.

public class Printer implements Job{ // just add 'public'! 
    public Printer(){ 
     System.out.println("created printer"); 
    } 

    @Override 
    public void execute(JobExecutionContext context) 
      throws JobExecutionException { 
     System.out.println("hi" + context.getFireTime()); 
    } 

} 

Đó là điều dễ hiểu, vì nó chỉ có thể vượt qua một <? extends Job>.class để trình lên lịch (địa ngục đẫm máu, tại sao ??) và không - ví dụ - đối tượng ẩn danh.

Có nói rằng, Tôi thấy thực sự làm xáo trộn cách Quartz âm thầm không kích hoạt công việc mà không có thông báo lỗi đơn.

+3

Một vấn đề khác có thể xảy ra nếu constractor yêu cầu tham số hoặc không công khai. Tôi tìm thấy vấn đề của tôi nhờ bạn. –

+2

Tôi gặp vấn đề tương tự. Tôi cũng tìm thấy nó rất kỳ quặc/bực bội mà không có thông báo lỗi được đưa ra ở tất cả ... –

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