2011-08-23 59 views

回答

33

你需要寫一份你的工作作爲InterruptableJob的實施。 要中斷這份工作,你需要處理對Scheduler,並調用interrupt(jobKey<<job name & job group>>)

請具有以上班看看@的javadoc,還石英分發包含一個這樣的例子(實施例7)。

+0

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

+1

此方法的限制是**不** **羣集意識。 Java doc: *此方法不支持羣集。也就是說,它只會中斷當前在此計劃程序實例中執行的InterruptableJob的實例,而不會在整個羣集中執行。* –

4

石英2.1使用Spring,你可以:

@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

在我看來,最好的辦法是在這個線程所描述的:一套停止後http://forums.terracotta.org/forums/posts/list/7700.page

我剛剛出臺了「休眠」標誌爲true以允許工作完成乾淨。

@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

我不知道爲什麼沒有人提到過這個問題,或者這個問題在提問時沒有提供。

調度程序實例有一種稱爲關閉的方法。

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

以上用於啓動工作像

scheduler.start(); 

使用標誌或東西,知道什麼時候該停止運行的工作。 然後使用

scheduler.shutdown(); 

我如何實現我的要求:

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

其中的JobDetail和simpleTrigger不言自明。

希望它有幫助。 :)

+7

此解決方案將關閉整個計劃程序,除非您將一個作業分配給計劃程序,否則這種方法並不正確。您應該有辦法只刪除特定的作業,而不是整個調度程序,因爲可能有多個作業在同一個調度程序上運行。 – Salman

相關問題