2011-08-17 152 views
2

我有一個春天的批量作業,需要安排在一天中的特定時間。我已經設置了一個Quartz CRON調度器來完成這個任務。但是我發現這項工作只會觸發一次。石英CRON只觸發作業一次

什麼可能是錯的?

以下是XML文件片段 -

<batch:job id="getFleetUpdatesJob" job-repository="jobRepository"> 
     <batch:step id="step0"> 
       <batch:tasklet ref="fleetUpdatesID" transaction-manager="jobRepository-transactionManager" /> 
     </batch:step>   
     <!-- <batch:step id="step1" next="step2"> 
       <batch:tasklet ref="world" transaction-manager="jobRepository-transactionManager" /> 
     </batch:step> -->  
    </batch:job>  

    <!-- Quartz related beans START --> 

    <bean name="updateDataFeedJobDetail" class="org.springframework.scheduling.quartz.JobDetailBean"> 
     <property name="jobClass" value="<package>.schedule.UpdateDataFeedJob" /> 
    </bean> 

    <bean id="cronTriggerId" class="org.springframework.scheduling.quartz.CronTriggerBean"> 
     <property name="jobDetail" ref="updateDataFeedJobDetail" /> 
     <!-- run every morning at 3AM --> 
     <!-- <property name="cronExpression" value="0 0 3 * * ?" /> --> 

     <!-- run the job at 8pm everyday --> 
     <property name="cronExpression" value="0 0 20 * * ?" /> 
    </bean> 

    <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> 
     <property name="triggers"> 
      <list> 
       <ref bean="cronTriggerId" /> 
      </list> 
     </property> 
    </bean> 
    <!-- Quartz related beans END --> 
+4

你有沒有試過用cron表達式來測試每分鐘觸發(所以你不必等24小時才能看到它是否工作)? –

+0

是的。其實測試我已配置爲0/5分鐘。但同樣的問題。它只運行一次。 –

回答

0

我懷疑cron表達式工作正常,但是Spring的批處理作業只會執行一次,除非它的參數發生變化。

,如果你得到類似的堆棧跟蹤您可以驗證這一點:

2011-08-18 00:40:26,155 INFO [org.springframework.batch.core.launch.support.SimpleJobLauncher] - <Job: [FlowJob: [name=job1]] completed with the following parameters: [{run.id=1}] and the following status: [COMPLETED]> 
2011-08-18 00:40:30,002 INFO [com.beny23.test.JobLauncherDetails] - <Quartz trigger firing with Spring Batch jobName=job1> 
2011-08-18 00:40:30,015 ERROR [com.beny23.test.JobLauncherDetails] - <Could not execute job.> 
org.springframework.batch.core.repository.JobInstanceAlreadyCompleteException: A job instance already exists and is complete for parameters={run.id=1}. If you want to run this job again, change the parameters. 
    at org.springframework.batch.core.repository.support.SimpleJobRepository.createJobExecution(SimpleJobRepository.java:122) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 

爲了確保爲每個作業invokation的參數是不同的,你可以修改UpdateDataFeedJob類打電話給你的工作是這樣:

JobParametersBuilder builder = new JobParametersBuilder(); 
builder.addLong("run.ts", System.currentTimeMillis()); 
JobParameters jobParameters = builder.toJobParameters(); 

Job job = jobLocator.getJob(jobName); 
jobLauncher.run(job, jobParameters); 
0

我現在不春天,但我使用Quartz。我想問題是,你給二的cron expression.You必須一次性cron表達式像0 0 3 -20 * *? (有些事情),crontrigger可以只有一個cron表達式重寫cron表達式,它在3和20時觸發。

+0

另一個cron expr被註釋掉了 –