我正在使用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>
答案 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();