2016-07-06 56 views
2

我正在開發一個使用Spring框架的Web應用程序,它在應用程序啓動時執行一些作業,這些作業主要包括從CSV加載數據並使Java對象不在其中。 目前,我正在嘗試使用Restlet和Spring框架構建一個RESTful API,並且其中一個查詢應該將作業名稱作爲參數並重新啓動該作業,即使該作業已標記爲「已完成」,如何完成工作重啓?我嘗試過Spring框架的Joboperator接口的startNextInstance()方法,並且還試圖手動增加JobParameters,以便沒有jobinstancerrradyrunning異常?從Spring框架重新運行完成的作業?

任何人都有任何代碼片段或關於如何重新啓動一個已被標記爲已完成的Spring框架中的作業的另一種想法?

任何幫助將不勝感激,謝謝!

回答

0

由於條款你使用我是你使用Spring Batch

在批處理方面相當肯定你不能真正重新啓動已完成實例或執行。單個作業實例由作業參數標識。如果您需要使用相同參數再次運行作業,則有一種方法是在啓動之前包含一些唯一參數,例如JobParameters的當前時間戳。

所以重啓完成的作業,將意味着開始一個新的實例,有着相近參數的工作。這裏有一個稍微修改的摘錄我已經使用了使用JobLauncherJobRegistry之前的名字,推出一個新的工作:

@Autowired 
@Qualifier("asyncJobLauncher") 
private JobLauncher asyncJobLauncher; 

@Autowired 
private JobRegistry jobRegistry; 

... 

public JobExecution startJob(String jobName) { 
    Job job; 
    try { 
     job = jobRegistry.getJob(jobName); 
    } catch (NoSuchJobException e) { 
     // handle invalid job name 
    } 

    JobParametersBuilder jobParams = new JobParametersBuilder(); 
    jobParams.addLong("currentTime", System.currentTimeMillis()); 
    // add other relevant parameters 

    try { 
     JobExecution jobExecution = asyncJobLauncher.run(job, jobParams.toJobParameters()); 
     return jobExecution; 
    } catch (JobExecutionAlreadyRunningException e) { 
     // handle instance already running with given params 
    } catch (Exception e) { 
     // handle other errors 
    } 
} 

希望它能幫助,這裏的一些reading這個話題。

+0

嗨,非常感謝你的回答。我嘗試了上面的代碼,但不幸的是,jobRegistry.getJob(jobName)部分即使使用有效的作業名稱也會拋出異常。所以,我試圖看看該怎麼做。 –

+0

你看到了什麼樣的例外?至少您需要確保JobRegistry和JobLauncher組件存在於應用程序上下文中。 – jp86

+0

嘿,很抱歉回覆晚了。我的JobLauncher沒有正確配置,所以它運行不正常,但我現在正在工作,非常感謝您的幫助! –