java - 将 Spring Batch 分区配置为处理器和写入器,同时从分区中排除读取器

标签 java multithreading spring parallel-processing spring-batch

我正在使用 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 &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

关于java - 将 Spring Batch 分区配置为处理器和写入器,同时从分区中排除读取器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23998495/

相关文章:

java - 使用内部类编译时出错

Java、Lock、Condition - 信号未唤醒等待线程

java spring ws : webServiceTemplate. marshalSendAndReceive 在发送之前签署文档

python - Tensorflow 中线程安全图的使用

java - 为什么我们需要在java文件中使用get方法 @RequestMapping(method = RequestMethod.GET)

java - Spring 4 : cannot get arguments annotations at interception?

java - android:textview 将自身调整为错误的 layout_width

java - 如何从字符串中打印随机字符?

java - 如何在单击按钮时将焦点设置在 jface 中的特定选项卡上

java - 如何同时等待一个整数达到某个值?