2015-11-25 76 views
1

我正在使用java石英schedular。我可以完美地安排工作,但我想要的是等待工作完成之後再運行第二輪,因爲運行每項工作所需的時間會有所不同。Quartz @DisallowConcurrentExecution不按預期工作

我使用了@DisallowConcurrentExecution,它所做的只是讓作業運行一次而不再運行。來自作業監聽器顯示作業成功完成一次。

Job 
============================================================= 

@DisallowConcurrentExecution 
public class SalesJob implements Job{ 
    List<Transaction> unsentTransaction = new ArrayList<Transaction>(); 
    List<Sale> sales = new ArrayList<Sale>(); 

    public void execute(JobExecutionContext jec) throws JobExecutionException { 
     System.out.println("Sales Job. . ."); 
    } 
} 

工作聽衆:

public class SalesJobListener implements JobListener{ 
public static final String LISTENER_NAME = "dummyJobListenerName"; 

public String getName() { 
    return LISTENER_NAME; 
} 

public void jobToBeExecuted(JobExecutionContext context) { 
    String jobName = context.getJobDetail().getKey().toString(); 
System.out.println("jobToBeExecuted"); 
System.out.println("Job : " + jobName + " is going to start..."); 
} 

public void jobExecutionVetoed(JobExecutionContext jec) { 
    System.out.println("jobExecutionVetoed"); 
} 

public void jobWasExecuted(JobExecutionContext context, JobExecutionException jobException) { 
    System.out.println("jobWasExecuted"); 
    String jobName = context.getJobDetail().getKey().toString(); 
    System.out.println("Job : " + jobName + " is finished..."); 
    System.out.println("====================================="); 
    System.out.println("==========" + new Date() + "==========="); 

    if (!jobException.getMessage().equals("")) { 
      System.out.println(
        "Exception thrown by: " + jobName + " Exception: " + jobException.getMessage()); 
    } 
} 

} 

這是程序器

JobKey salesJobKey = new JobKey("salesJob", "group1"); 
    JobDetail salesJob = JobBuilder.newJob(SalesJob.class) 
    .withIdentity(salesJobKey).build(); 

    Trigger salesTrigger = TriggerBuilder 
          .newTrigger() 
          .withIdentity("salesTrigger", "group1") 
          .withSchedule(
            CronScheduleBuilder.cronSchedule("0/5 * * * * ?")) 
          .build(); 

    Scheduler scheduler = new StdSchedulerFactory().getScheduler(); 
    scheduler.getListenerManager().addJobListener(
     new SalesJobListener(), KeyMatcher.keyEquals(salesJobKey) 
    ); 

    scheduler.start(); 
    scheduler.scheduleJob(salesJob, salesTrigger); 
+0

你會等一分多鐘嗎?根據你的日程安排,cron將在每分鐘的第二個'0'和第二個'5'運行,但**將等待直到完成啓動另一個工作** –

+0

這次執行,Wed Nov 25 12:01:15 EAT 2015和現在是2015年11月25日星期三12:32,所以基本上我已經等了> 30分鐘。 。 。並且如果第二個15被執行,則沒有其他工作 –

+0

意味着您的日程安排不起作用。 –

回答

1

問題

它執行此時,週三11月25日12時01分15秒EAT 2015,現在是2015年11月25日星期三12:32,所以基本上我已經等了> 30分鐘。 。 。並沒有其他工作

這就是說Scheduler不起作用。

爲什麼?

  • 你不能在一分鐘因爲模式的第二個15執行作業:0/5 * * * * ?使得調度以秒0和每分鐘5運行ONLY
  • 使用@DisallowConcurrentExecution將阻止執行作業,如果另一個相同類型已經在運行。

SOLUTION:

錯就錯在你的代碼的順序,執行再調度(scheduler.start();)告訴之前,它必須安排一個作業(scheduler.scheduleJob(salesJob, salesTrigger);):

scheduler.start(); 
scheduler.scheduleJob(salesJob, salesTrigger); 

檢查this example並換行:

scheduler.scheduleJob(salesJob, salesTrigger); 
scheduler.start(); 

這就是全部...

+0

我交換你說的,但沒有區別。是的,它啓動11月25日12:55:00 2015年消耗,即使在一分鐘後,其不再執行 –

+0

@YunusEinsteinium你檢查鏈接提供?創建調度程序時是否有任何錯誤? –

+0

通過上面發佈的代碼,在創建調度程序時不會出現錯誤。如果我使用@DisallowConcurrencyExecution註釋Job實現類,該作業只執行一次,但沒有這個註釋,它會執行多次 –