2014-10-02 75 views
3

行,Spring批處理作業實例已存在

我知道這已被問過,但我仍然無法找到我的問題的確切答案。我的問題是這樣的:我使用spring批處理將數據導出到SOLR搜索服務器。它需要每分鐘運行一次,所以我可以導出所有更新。第一次執行通過OK,但與第二個抱怨:

2014-10-02 20:37:00,022 [defaultTaskScheduler-1] ERROR: catching 
org.springframework.batch.core.repository.JobInstanceAlreadyCompleteException: A job  instance already exists and is complete for parameters={catalogVersionPK=3378876823725152, 
type=UPDATE}. If you want to run this job again, change the parameters. 
    at org.springframework.batch.core.repository.support.SimpleJobRepository.createJobExecution(SimpleJobRepository.java:126) 
    at 

我當然可以是一個日期 - 時間參數添加到作業是這樣的:

.addLong("time", System.getCurrentTimeMillis()) 

,然後運行作業不止一次。不過,我也想查詢作業的最後執行,讓我有這樣的代碼:

DateTime endTime = new DateTime(0); 
JobExecution je = jobRepository.getLastJobExecution("searchExportJob", new JobParametersBuilder().addLong("catalogVersionPK", catalogVersionPK).addString("type", type).toJobParameters()); 
if (je != null && je.getEndTime() != null) { 
    endTime = new DateTime(je.getEndTime()); 
} 

,這沒有返回,因爲我沒有提供時間參數。所以好像我可以運行一次這個工作並獲得最後的執行時間,或者我可以多次運行它,而不是最後的執行時間。我真的堅持:(

回答

3

使用作業瀏覽器由Luca巴索·裏奇的建議。

因爲你不知道工作參數,你需要通過實例來查找。

  1. 尋找名爲searchExportJob
  2. 工作的最後一個實例
  3. 查找實例的最後一次執行上述

使用Spring Batch的API只

//We can set count 1 because job instance are ordered by instance id descending 
//so we know the first one returned is the last instance 
List<JobInstance> instances = jobExplorer.getJobInstances("searchExportJob",0,1); 
JobInstance lastInstance = instances.get(0); 
List<JobExecution> jobExecutions = jobExplorer.getJobExecutions(lastInstance); 

//JobExcectuin is ordered by execution id descending so first 
//result is the last execution 
JobExecution je = jobExecutions.get(0); 
if (je != null && je.getEndTime() != null) { 
    endTime = new DateTime(je.getEndTime()); 
} 

注意這這種方式代碼只適用於2.1.x的Spring Batch 2.2.x及更高版本,API有所不同

1

假設

Spring Batch的使用一些表來存儲與其參數來執行各任務。 如果您運行兩次使用相同的參數工作,第二個失敗,因爲作業由作業名和參數標識。

1#解決方案

運行新的工作時,你可以使用JobExecution。

JobExecution execution = jobLauncher.run(job, new JobParameters()); 
..... 
// Use a JobExecutionDao to retrieve the JobExecution by ID 
JobExecution ex = jobExecutionDao.getJobExecution(execution.getId()); 

2#解決方案

你可以實現自定義JobExecutionDao和執行自定義查詢來查找您JobExecutionBATCH_JOB_EXECUTION表。 See here Spring的參考。

我希望我的回答對你有幫助。

+0

我可以'因爲那時候執行是失敗的。如果我沒有想到更好的方法,我可能會最終使用您的解決方案2-創建一個自定義的DAO。 – 2014-10-06 14:05:54

+0

@PetarTahchiev讓我知道如果工作正常。爲了解決這個問題:) – Xstian 2014-10-06 19:11:03

1

還有另外一個界面,您可以使用:JobExplorer
從它的javadoc:

入口點瀏覽運行或歷史的工作和 步驟的執行。由於數據可能會從持久性存儲重新水合,它 可能不含有揮發性字段會一直存在,當 執行活躍

+0

我沒有看到JobExplorer中的方法,這將幫助我實現我想要的:( – 2014-10-06 14:07:34

相關問題