为处理器和写入器配置 spring 批处理分区,同时将读取器排除在分区之外

我正在使用spring batch patitioning来运行一个作业的多个线程 . 该作业应该从数据库中读取,处理数据并将结果写入数据库文件,下面是我当前的工作配置 .

<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)

2 years ago

如果没有为您的阅读器配置,很难给您一个确切的解决方案,但我的赌注是您没有将范围值注入您的查询 . 下面是在远程分区作业中使用 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 &lt;= :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