2011-08-23 24 views

Trả lời

33

Bạn cần phải viết một công việc của mình dưới dạng triển khai InterruptableJob. Để gián đoạn công việc này, bạn cần xử lý để Scheduler và gọi interrupt(jobKey<<job name & job group>>)

Vui lòng xem @ javadoc cho các lớp ở trên, phân phối thạch anh chứa ví dụ về điều này (ví dụ7).

+0

Thx)))))))))))) – user253202

+1

Giới hạn của cách tiếp cận này là ** không ** nhận biết cụm. Tài liệu Java: * Phương pháp này không nhận biết được cụm. Tức là, nó sẽ chỉ làm gián đoạn các thể hiện của InterruptableJob đã xác định hiện đang thực thi trong cá thể Scheduler này, không phải trên toàn bộ cluster. * –

4

Trong Quartz 2.1 với mùa xuân bạn có thể:

@Autowired 
private Scheduler schedulerFactoryBean; //injected by spring 
... 
... 

List<JobExecutionContext> currentlyExecuting = schedulerFactoryBean.getCurrentlyExecutingJobs(); 

//verifying if job is running  
for (JobExecutionContext jobExecutionContext : currentlyExecuting) { 
    if(jobExecutionContext.getJobDetail().getKey().getName().equals("JobKeyNameToInterrupt")){ 
     result = schedulerFactoryBean.interrupt(jobExecutionContext.getJobDetail().getKey()); 
    } 
} 
2

Giải pháp tốt nhất theo ý kiến ​​của tôi là một trong những mô tả trong luồng này: http://forums.terracotta.org/forums/posts/list/7700.page

Tôi vừa mới giới thiệu một "giấc ngủ" sau khi thiết lập điểm dừng gắn cờ thành true để cho phép công việc hoàn thành một cách rõ ràng.

@Override 
public void interrupt() throws UnableToInterruptJobException { 
    stopFlag.set(true); 
    try { 
     Thread.sleep(30000); 
    } catch (InterruptedException e) { 
     //logger.error("interrupt()", e); 
    } 
    Thread thread = runningThread.getAndSet(null); 
    if (thread != null) 
     thread.interrupt(); 
} 
2

Tôi không biết tại sao không ai đề cập đến điều này, hoặc có thể điều này không có sẵn tại thời điểm câu hỏi được hỏi.

Có một phương pháp được gọi là tắt máy cho phiên bản Trình lập lịch biểu.

SchedulerFactory factory = new StdSchedulerFactor(); 
Scheduler scheduler = factory.getScheduler(); 

Trên đây được sử dụng để bắt đầu một công việc như

scheduler.start(); 

Sử dụng một lá cờ hoặc một cái gì đó để biết khi nào phải ngừng công việc từ chạy. Sau đó sử dụng

scheduler.shutdown(); 

Làm thế nào tôi thực hiện yêu cầu của tôi:

if(flag==true) 
    { 
     scheduler.start(); 
     scheduler.scheduleJob(jobDetail, simpleTrigger); 
    } 
    else if(flag==false) 
    { 
     scheduler.shutdown(); 
    } 

đâu jobDetail và simpleTrigger là tự giải thích.

Hy vọng điều đó sẽ hữu ích. :)

+7

Giải pháp này tắt toàn bộ lịch biểu mà không thực sự chính xác trừ khi bạn có một công việc được gán cho bộ lập lịch. Bạn nên có một cách để loại bỏ chỉ công việc cụ thể không phải là toàn bộ lịch trình bởi vì nó có thể có nhiều hơn một công việc đang chạy trên cùng một lịch trình. – Salman