将当前时间戳作为弹簧批处理中的作业参数传递

时间:2017-09-28 20:13:26

标签: java spring spring-batch spring-batch-admin

我正在使用spring批处理,但是由于作业实例已经存在错误,我需要在我的作业参数中添加当前时间。我无法确定添加作业参数的位置。这是我的代码:

<step id="myStep">
 <tasklet>
  <chunk reader="myReader" processor="myProcessor" writer="myWriter" commit-interval="6000" skip-limit="9000">
  //some more code.
 </chunk>
 </tasklet>
</step>

<bean id="myReader" class="org.springframework,batch.item.database.StoredProcedueItemReader" scope="step">
 //define property for datasource , procedurename , rowmapper, parameters
 <property name="preparedStatementSetter" ref="myPreparedStatmentSetter">
</bean>

<bean id="myPreparedStatmentSetter" class="com.mypackage.MyPreparedStatementSetter" scope="step">
 <property name="kId" value="#{jobParameters[kId]}">
</bean>

当我尝试多次运行相同kId的作业时,出现The job already exist错误,因此我需要将当前时间戳添加到我的作业参数中。 将当前时间戳添加为bean myPreparedStatmentSetter中的属性是否足够,或者我是否还需要在其他地方添加jobparameter?从spring文件中选择的工作参数究竟在哪里?

如果我需要在bean中添加时间戳,这里有一个问题 - 我的存储过程只需要kID作为参数,我不需要将当前时间戳传递给存储过程,那么为什么我需要添加同样在myPreparedStatmentSetter

另外,如何在没有java代码的xml文件中添加当前时间戳?

修改

这是我的jobLauncher bean

<bean Id= "jobLauncher "class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
 <property name="jobRepository" value="myJobRepo">
</bean>

2 个答案:

答案 0 :(得分:3)

手动添加“随机”作业参数,虽然它可以工作,但并不是解决作业实例已存在错误的最理想方式。相反,您应该考虑在工作中添加JobParametersIncrementer。 Spring提供RunIdIncrementer作为开箱即用的实现。使用它配置的作业类似于以下内容:

@Bean
public Job myJob() { 
    return jobBuilderFactory.get("myJob")
                            .incrementer(runIdIncrementer())
                            .start(step1())
                            .build();
}

@Bean
public JobParametersIncrementer runIdIncrementer() {
    return new RunIdIncrementer();
}

答案 1 :(得分:1)

我猜你已经在你的工作参数中添加了KId。在您的joblaucher.run()方法中添加以下内容。

new JobParametersBuilder()
.addLong("time",System.currentTimeMillis())
.addLong("KId",<your KID>)
.toJobParameters();