Spring Batch 之 JobParameters (十)

      继续前面关于Spring Batch系列的文章,本文主要介绍与JobParameters相关的一些知识。

一、JobParameters

      顾名思义,所谓JobParameters,就是Job运行时的参数。它在bath中有两个作用:一是标示不同的jobInstance,二是作为job中用到的信息,以参数的形式传给job。

      如何使用JobParameters呢?它主要是在启动的job的时候,与job联系起来的。看一下框架提供的启动job的接口JobLauncher的源代码,就会发现其run方法需要两个参数,一个是Job,也就是需要启动的job,另一个就是JobParameters。可以通过如下方式使用:

      jobLauncher.run(job, new JobParametersBuilder() 

                                           .addString("para1", "value1") 

                                           .addString("para2","value2")

                                           .toJobParameters()

                              );

如代码所示,参数para1和para2就可以传给Job了,在Job中如果需要使用参数信息,可以使用Spring注入的方式传给不同的使用对象。

<bean:bean id="itemReader" class="com.wanggc.springbatch.BatchItemReader" scope="step">
<bean:property name="filePath" value="#{jobParameters['inputFilePath']}" />
</bean:bean>

注意需要设置Bean的scope属性为step,这是SpringBatch的一个后绑定技术,就是在生成Step的时候,才去创建bean,因为这个时候jobparameter才传过来。如果加载配置信息的时候就创建bean,这个时候jobparameter的值还没有产生,会抛出异常。

二、JobParametersValidator

      SpringBatch框架支持JobParameters的简单验证,并提供了JobParametersValidator接口和validate方法,用于在job启动之前对参数信息验证和检查。如果需要对参数进行验证,就可以实现此接口,并在validate方法中定制验证规则,当验证失败的时候,会抛出JobParametersInvalidException异常。当然,SpringBatch框架也提供了一个默认的验证类DefaultJobParametersValidator,但此类验证功能有限,主要用于必须项和非必须项的验证。通过如下配置可以实现此验证功能。

<job id="batchJob">            
......
<validator ref="jobParametersValidator" />
</job>
<bean:bean id="jobParametersValidator"
class
="org.springframework.batch.core.job.DefaultJobParametersValidator">
<bean:property name="requiredKeys">
<bean:set>
<bean:value>para1</bean:value>
<bean:value>para2</bean:value>
<bean:value>para3</bean:value>
</bean:set>
</bean:property>
<bean:property name="optionalKeys">
<bean:set>
<bean:value>para4</bean:value>
</bean:set>
</bean:property>
</bean:bean>

      DefaultJobParametersValidator类提供两个重要属性:requiredKeys和optionalKeys,前者为JobParameters中必须包含的项,但对参数的实际值不做check(不做空的check),只要包含此项的key就可以了;后者为可选项,有没有此项都可以。但如果JobParameters中含有两者以外的项,也会抛出JobParametersInvalidException异常。

三、JobParametersIncrementer

      JobParametersIncrementer主要用于JobOperator接口的startNextInstance等方法启动job的情况下。同一个Job在batch启动后被多次调用的场合,startNextInstance方法将会非常有用,因为它将使用JobParametersIncrementer与Job绑定,创建一个新实例。因为JobParametersIncrementer有一个getNext方法,可以在此方法中为parameters添加一个自增的值,以区分不同的Job实例,当然,这个值在job的其他的地方并不会用到,仅仅是为了标示不同JobInstance。当然SpringBatch框架也为我们提供了一个JobParametersIncrementer的实现类RunIdIncrementer 。使用方法如下:

<job id="batchJob" incrementer="sampleIncrementer">        
......
<validator ref="jobParametersValidator" />
</job>
<bean:bean id="sampleIncrementer"
class
="org.springframework.batch.core.launch.support.RunIdIncrementer"/>

      RunIdIncrementer的getNext方法实现如下:

public JobParameters getNext(JobParameters parameters) {            
if (parameters == null) {
parameters = new JobParameters();
}
long id = parameters.getLong(key, 0L) + 1;
return new JobParametersBuilder(parameters).addLong(key, id).toJobParameters();
}

      由代码可以看出,当parameters为null时,创建一个新的JobParameters,并添加一项“key”;不为null时,直接给原来的parameters添加一项。最后直接返回。因为key代表的value每次是都会在原来的基础上加1,这样就保证了每次创建的jobInstance是不同的了。

     以上,就是JobParameters主要知识点的介绍,下次,将介绍SpringBatch其他的一些技术知识点。

 

转载于:https://www.cnblogs.com/gulvzhe/archive/2012/01/31/2332530.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果您的Spring Batch Job在重复执行,则可能有几个原因: 1. 作业实例未正确标记为已完成 Spring Batch会在内部维护一个作业实例表,以跟踪已完成的作业。如果作业实例未正确标记为已完成,则Spring Batch会认为该作业尚未完成,从而导致重复执行。您可以在Spring Batch的元数据存储中查看作业实例表,并确保所有作业实例都已正确标记为已完成。 2. 作业配置问题 如果您的作业配置不正确,则可能导致重复执行。例如,如果您的作业配置中没有指定适当的JobParameters,则可能会导致重复执行。确保您的作业配置正确,并且您提供了正确的JobParameters。 3. 作业步骤状态问题 如果您的作业步骤状态不正确,则可能导致重复执行。例如,如果您的作业步骤在执行期间失败,但未正确标记为已失败,则可能导致Spring Batch在下一次执行时再次执行该步骤。确保您的作业步骤状态正确,并且在执行期间正确标记为已完成或已失败。 4. 定时任务问题 如果您的作业是由定时任务触发的,则可能会出现问题。例如,如果您的定时任务配置不正确,则可能会导致重复执行。确保您的定时任务配置正确,并且您已正确配置定时任务触发器。 如果您排除了以上所有问题,并且仍然看到重复执行的问题,则可能需要进一步调试。您可以使用Spring Batch的调试工具来诊断问题,并查看Spring Batch的日志以获取更多信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值