我正在使用spring批处理模块处理目录中的csv文件。目录可能包含具有特定扩展名的多个文件,我正在使用MultiResourceItemReader来读取这些文件。 作业将接收3个作业参数,分别为read_from_directory,move_to_directory和default_user_id。所有这些参数对于所有作业运行将保持相同。 read_from_directory将包含 多个csv文件,作业应该一个接一个地处理这些文件。我面临的问题是因为作业参数是相同的,我得到JobInstanceAlreadyCompleteException当第二次运行作业。我知道这个问题可以通过使用额外的时间戳参数来使作业参数唯一来解决。但是由于添加时间戳参数会使每个作业实例都是唯一的,我不希望使用这种方法,因为它会在使作业可重新启动时产生问题。 所以我想一些建议,spring批处理 - multiResourceItemReader:如何使作业参数唯一并重新启动作业
我怎样才能使各项工作实例是唯一不使用时间戳参数。
在这种情况下如何使作业可重新启动?加入'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>
谢谢。