2012-02-06 31 views
12

Tôi muốn làm rõ chi tiết về phương thức scheduler.getCurrentlyExecutingJobs() trong Quartz1.6. Tôi có một công việc chỉ nên có một cá thể đang chạy tại bất kỳ thời điểm nào. Nó có thể được kích hoạt để "chạy ngay" từ một giao diện người dùng nhưng nếu một cá thể công việc đã chạy cho công việc này - không có gì xảy ra.tìm một công việc đang chạy trong Quartz1.6

Đây là cách tôi kiểm tra xem có một công việc chạy mà bạn quan tâm tôi:

List<JobExecutionContext> currentJobs = scheduler.getCurrentlyExecutingJobs(); 
    for (JobExecutionContext jobCtx: currentJobs){ 
    jobName = jobCtx.getJobDetail().getName(); 
    groupName = jobCtx.getJobDetail().getGroup(); 
    if (jobName.equalsIgnoreCase("job_I_am_looking_for_name") && 
     groupName.equalsIgnoreCase("job_group_I_am_looking_for_name")) { 
     //found it! 
     logger.warn("the job is already running - do nothing"); 
    }    
} 

sau đó, để kiểm tra này, tôi có một bài kiểm tra đơn vị mà cố gắng để sắp xếp hai trường hợp của công việc này một sau khi khác . Tôi đã chờ đợi để xem cảnh báo khi cố gắng sắp xếp công việc thứ hai, tuy nhiên, thay vào đó, tôi nhận được ngoại lệ này:

org.quartz.ObjectAlreadyExistsException: Unable to store Job with name: 
'job_I_am_looking_for_name' and group: 'job_group_I_am_looking_for_name', 
because one already exists with this identification. 

Khi tôi chạy thử nghiệm đơn vị này trong một chế độ debug, với sự đột phá về dòng này :

Liệt kê currentJobs = scheduler.getCurrentlyExecutingJobs();

tôi nhìn thấy danh sách là rỗng - vì vậy scheduler không thấy công việc này như chạy, nhưng nó vẫn thất bại trong việc sắp xếp nó một lần nữa - mà nói với tôi công việc đã thực sự chạy vào thời điểm đó ...

Tôi có thiếu một số điểm tốt hơn với phương pháp lập lịch này?

Cảm ơn!

Marina

Trả lời

18

Đối với lợi ích của người khác, tôi đăng một câu trả lời cho vấn đề tôi đã có - Tôi đã nhận sự giúp đỡ từ Zemian Đặng các Terracotta diễn đàn của: posting on Terracotta's forum

Đây là tái nắp: Việc kiểm tra thực tế các công việc đang chạy đã hoạt động tốt - tất nhiên chỉ là thời gian trong các bài kiểm tra Đơn vị. Tôi đã thêm một số ngủ trong công việc, và kiểm tra đơn vị tinh chỉnh để lên lịch công việc thứ hai trong khi đầu tiên vẫn đang chạy - và xác minh rằng tôi thực sự có thể tìm thấy công việc đầu tiên vẫn đang chạy.

Trường hợp ngoại lệ tôi nhận được là vì tôi đang cố lên lịch một công việc mới có cùng tên, thay vì cố gắng kích hoạt công việc đã được lưu trữ trong công việc lên lịch. Mã sau hoạt động chính xác như tôi cần:

List<JobExecutionContext> currentJobs = scheduler.getCurrentlyExecutingJobs(); 
for (JobExecutionContext jobCtx: currentJobs){ 
    jobName = jobCtx.getJobDetail().getName(); 
    groupName = jobCtx.getJobDetail().getGroup(); 
    if (jobName.equalsIgnoreCase("job_I_am_looking_for_name") && groupName.equalsIgnoreCase("job_group_I_am_looking_for_name")) { 
     //found it! 
     logger.warn("the job is already running - do nothing"); 
       return; 
    }    
} 
     // check if this job is already stored in the scheduler 
JobDetail emailJob; 
emailJob = scheduler.getJobDetail("job_I_am_looking_for_name", "job_group_I_am_looking_for_name"); 
if (emailJob == null){ 
     // this job is not in the scheduler yet 
    // create JobDetail object for my job 
    emailJob = jobFactory.getObject(); 
    emailJob.setName("job_I_am_looking_for_name"); 
    emailJob.setGroup("job_group_I_am_looking_for_name"); 
    scheduler.addJob(emailJob, true);    
} 

// this job is in the scheduler and it is not running right now - run it now 
scheduler.triggerJob("job_I_am_looking_for_name", "job_group_I_am_looking_for_name"); 

Cảm ơn! Marina

+1

Chỉ cần lưu ý rằng phương thức 'getCurrentlyExecutingJobs()' không phải là cụm nhận biết, vì vậy nó sẽ hoạt động nếu bạn chỉ sử dụng cấu hình Quartz một nút. – Marboni

+0

cảm ơn bạn vì mẹo hữu ích! – Marina

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