【发布时间】:2015-06-10 15:20:17
【问题描述】:
我正在使用 spring 批处理模块来处理目录中的 csv 文件。目录可能包含具有特定扩展名的多个文件,我正在使用 MultiResourceItemReader 来读取文件。 作业将接收 3 个作业参数,即 read_from_directory、move_to_directory 和 default_user_id。对于所有作业运行,所有这些参数都将保持不变。 read_from_directory 将包含 多个 csv 文件和作业应该一个接一个地处理这些文件。我面临的问题是,由于作业参数相同,我在第二次运行作业时收到 JobInstanceAlreadyCompleteException。我知道这个问题可以通过使用额外的时间戳参数来使作业参数独一无二来解决。但是由于添加时间戳参数将使每个作业实例都是唯一的,我不希望使用这种方法,因为它会在使我的作业可重新启动时产生问题。 所以我想提出一些建议,
如何在不使用时间戳参数的情况下使每个作业实例唯一。
在这种情况下如何使作业可重新启动?添加 'restartable="true"' 就足够了,或者我需要一些额外的配置/编码。我在这里有点困惑,因为作业将从一个目录中读取多个文件。因此,如果作业失败,例如,由于其中一个文件中的记录不正确,我如何从它离开的位置重新启动同一个作业?我已将作业配置为在一定时间间隔后使用调度程序定期运行。因此,如果作业失败,然后我纠正了 csv 文件中的错误,作业会在下次运行时从它停止的地方开始吗?
请从我的配置中找到以下相关部分:
<batch:job id="testJob" restartable="true">
<batch:step id="step1">
<batch:tasklet>
<batch:chunk reader="multiResourceItemReader" writer="fileWriter"
commit-interval="1">
</batch:chunk>
</batch:tasklet>
</batch:step>
</batch:job>
<bean id="fileWriter" class="com.ivish.TestFileWriter" />
<bean id="multiResourceItemReader" class="org.springframework.batch.item.file.MultiResourceItemReader" scope="step">
<property name="resources" value="file:#{jobParameters['read_from_directory']}/*.csv" />
<property name="delegate" ref="fileReader" />
</bean>
<bean id="fileReader" class="com.ivish.TestFileReader" scope="step">
<property name="delegate" ref="delegateFileReader" />
<property name="moveToDirectory" value="#{jobParameters['move_to_directory']}" />
</bean>
<bean id="delegateFileReader" class="org.springframework.batch.item.file.FlatFileItemReader">
<property name="lineMapper">
<bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper">
<property name="lineTokenizer" ref="fileTokenizer" />
<property name="fieldSetMapper">
<bean
class="org.springframework.batch.item.file.mapping.PassThroughFieldSetMapper" />
</property>
</bean>
</property>
</bean>
谢谢。
【问题讨论】:
标签: spring spring-batch