我正在使用 spring 批处理分区来运行作业的多个线程。 该作业应该从数据库读取,处理数据并将结果写入数据库文件, 以下是我当前工作的配置。
<step id="masterStep">
<partition step="slave" partitioner="rangePartitioner">
<handler grid-size="10" task-executor="taskExecutor" />
</partition>
</step>
</job>
<!-- Jobs to run -->
<step id="slave" xmlns="http://www.springframework.org/schema/batch">
<tasklet>
<chunk reader="pagingItemReader" writer="flatFileItemWriter"
processor="itemProcessor" commit-interval="1" />
</tasklet>
</step>
使用此配置,当作业运行时,会启动 10 个作业线程,这也意味着使用 10 个读取器,这意味着每条记录将被处理 10 次,从而导致分区无用。
您能否协助提供一种解决方案,仅对处理器和读取器进行分区,以便我们拥有处理器和写入器的多个线程,并仅使用读取器的 1 个实例
最佳答案
如果没有针对您的阅读器的配置,很难为您提供准确的修复,但我敢打赌您不会将范围值注入(inject)查询中。下面是在远程分区作业中使用 JdbcPagingItemReader 的示例。您会注意到正在读取的项目范围是由 stepExecutionContext
提供的。这些是分区程序提供的值。每个 ItemReader
都会获得自己的值。
<bean id="targetItemReader" class="org.springframework.batch.item.database.JdbcPagingItemReader" scope="step">
<property name="dataSource" ref="dataSource" />
<property name="queryProvider">
<bean
class="org.springframework.batch.item.database.support.SqlPagingQueryProviderFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="selectClause" value="ID, IP, PORT, CONNECTED, BANNER" />
<property name="fromClause" value="FROM TARGET" />
<property name="whereClause" value="ID >= :minId AND ID <= :maxId AND CONNECTED IS NULL"/>
<property name="sortKey" value="ID" />
</bean>
</property>
<property name="pageSize" value="10" />
<property name="parameterValues">
<map>
<entry key="minId" value="#{stepExecutionContext[minValue]}"/>
<entry key="maxId" value="#{stepExecutionContext[maxValue]}"/>
</map>
</property>
<property name="rowMapper">
<bean class="com.michaelminella.springbatch.domain.TargetRowMapper"/>
</property>
</bean>
您可以在我在 YouTube 上的演讲中了解有关远程分区的更多信息:https://www.youtube.com/watch?v=CYTj5YT7CZU 该演讲的代码在这里:https://github.com/mminella/Spring-Batch-Talk-2.0
关于java - 将 Spring Batch 分区配置为处理器和写入器,同时从分区中排除读取器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23998495/