春季批处理:工作随机选择比提交间隔少的行更少的块



我在春季批处理面临问题。我们在工作中使用了一个任务执行人(SimpleSynctasKexecutor),该委托人处理两个并行步骤的流程。

在每个步骤中,任务执行人将读者返回的每个数据片段分配给其他线程(使用多线程步骤概念:请参阅https://docs.spring.io/spring.io/spring-batch/trunk/Reference/html/scalibaly.html)

问题在于我们的提交间隔很大(24,000),读者返回的行数很小(少于50行),但作者有时会收到多个以上的块(例如,一部分30行和20行的一小部分,但是对于另一个行程,可以是25行的一部分,而只有25行或仅一大块50行,这似乎是随机的)任何运行的行(不应该是随机的),因为它不会跨越提交间隔。

我试图理解为什么在某些运行中随机发生这种情况。如果有人在春季批处理中知道这个问题,您能帮我吗?

谢谢。

这是我的工作的配置(不包括我们的自定义作家):

    <batch:job id="job">
             <batch:split id="split" task-executor="taskExecutor">  
                <batch:flow> 
                    <batch:step id="step1"> 
                        <batch:tasklet task-executor="taskExecutor" throttle-limit="4" >
                              <batch:chunk reader="reader1" writer="writer1" commit-interval="24000" />         
                        </batch:tasklet>
                    </batch:step>
                </batch:flow>
                <batch:flow> 
                    <batch:step id="step2">
                        <batch:tasklet task-executor="taskExecutor" throttle-limit="4" >
                              <batch:chunk reader="reader2" writer="writer2" commit-interval="24000" />         
                        </batch:tasklet>
                    </batch:step>
                </batch:flow>       
             </batch:split>
        </batch:job>
    <bean id="reader1" class="org.springframework.batch.item.database.JdbcPagingItemReader" scope="step">       
         <property name="dataSource" ref="postgresql_1" />                           
         <property name="queryProvider">            
             <bean class="org.springframework.batch.item.database.support.PostgresPagingQueryProvider">
                    <property name="selectClause" value="
                        SELECT name
                    " />
                    <property name="fromClause" value="
                        FROM database.people
                    " />
                    <property name="whereClause" value="
                        WHERE age > 30
                    " />
                    <property name="sortKeys">
                        <map>
                            <entry key="people_id" value="ASCENDING"/>
                        </map>
                    </property>             
            </bean>         
        </property>         
        <property name="saveState" value="false" />         
        <property name="rowMapper">             
             <bean class="fr.myapp.PeopleRowMapper" />      
        </property>     
    </bean>
        <bean id="reader2" class="org.springframework.batch.item.database.JdbcPagingItemReader" scope="step">       
       <property name="dataSource" ref="postgresql_1" />        
       <property name="queryProvider">          
               <bean class="org.springframework.batch.item.database.support.PostgresPagingQueryProvider">
                    <property name="selectClause" value="
                         SELECT product_name
                    " />
                    <property name="fromClause" value="
                        FROM database.products
                    " />
                    <property name="whereClause" value="
                        WHERE product_order_date <= '01/11/2017'
                    " />
                    <property name="sortKeys">
                        <map>
                            <entry key="product_id" value="ASCENDING"/>
                        </map>
                    </property>             
               </bean>      
           </property>      
       <property name="saveState" value="false" />      
       <property name="rowMapper">
                <bean class="fr.myapp.ProductsRowMapper" />
       </property>  
    </bean>
    <bean id="taskExecutor" class="org.springframework.core.task.SimpleAsyncTaskExecutor">
          <property name="concurrencyLimit" value="8" />
    </bean>

当您看到较小的块时,在工作中间吗?RowMappers中是否有任何逻辑或您所忽略的任何内容都可以汇总读取结果?

最新更新