【问题标题】:Configure spring batch partition to for processor and writer whilst excluding the reader from the partitioning将spring批处理分区配置为处理器和写入器,同时将读取器排除在分区之外
【发布时间】:2014-07-22 19:18:52
【问题描述】:

我正在使用 spring 批处理 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 个实例

【问题讨论】:

    标签: java multithreading spring parallel-processing spring-batch


    【解决方案1】:

    如果没有针对您的阅读器的配置,很难为您提供准确的修复,但我敢打赌,您不会将范围值注入查询中。下面是在远程分区作业中使用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

    【讨论】:

    • 感谢帮助,readre的配置解决了我的问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-31
    • 2020-09-10
    • 2018-04-28
    • 2018-04-15
    • 1970-01-01
    • 2013-12-17
    • 1970-01-01
    相关资源
    最近更新 更多