在Spring批处理中,我试图读取一个CSV文件,并希望将每行分配给一个单独的线程并对其进行处理。我试图通过使用任务执行程序来实现它,它正在工作,如果我没有使用作业参数获取文件名。如果我从scope="step"
以后通过作业参数,所有线程正在从文件中读取相同的行。如果我改变了scope="job"
,如果是的话请建议方式吗?目前,我下面得到一个错误:spring批处理多线程文件读取
产生的原因:java.lang.IllegalStateException:没有适用范围适用于范围名 '工作'
请帮助注册...
查找下面的Job.xml
<job id="partitionJob" xmlns="http://www.springframework.org/schema/batch" restartable="true">
<step id="step" allow-start-if-complete="true">
<partition step="step2" partitioner="partitioner">
<handler grid-size="3" task-executor="taskExecutor" />
</partition>
</step>
</job>
<bean id="partitioner" class="com.range.part.RangePartitioner">
</bean>
<bean id="taskExecutor" class="org.springframework.core.task.SimpleAsyncTaskExecutor" />
<step id="step2" xmlns="http://www.springframework.org/schema/batch">
<tasklet transaction-manager="transactionManager">
<chunk reader="itemReader" writer="cutomitemWriter" processor="itemProcessor" commit-interval="100" />
</tasklet>
</step>
<bean id="itemProcessor" class="com.range.processor.UserProcessor" scope="step">
<property name="threadName" value="#{stepExecutionContext[name]}"/>
</bean>
<bean id="itemReader" class="org.springframework.batch.item.file.FlatFileItemReader" scope="job">
<property name="resource" value="file:#{jobParameters[file]}">
</property>
<!-- <property name="linesToSkip" value="1"/> -->
<property name="lineMapper">
<bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper">
<property name="lineTokenizer">
<bean class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer">
<property name="delimiter" value="," />
<!-- <property name="names" value="transactionBranch,batchEntryDate,batchNo,channelID,CountryCode" />-->
</bean>
</property>
<property name="fieldSetMapper">
<bean class="com.fieldset.FieldsetMapper">
</bean>
</property>
</bean>
</property>
</bean>
<bean id="cutomitemWriter" class="com.range.processor.customitemWritter">
</bean>
提供的信息不够全面。你需要发布一些代码。 – marthursson
看起来你正在读取每个线程内的文件而不是外部线程。 –
你是否想让它们在不同的线程上读取(不一定是最高性能的选项),或者只是在不同的线程上处理? –