在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
看起來你正在讀取每個線程內的文件而不是外部線程。 –
你是否想讓它們在不同的線程上讀取(不一定是最高性能的選項),或者只是在不同的線程上處理? –