2017-11-30 13 views
0

스프링 배치에 문제가 있습니다. 작업에서 두 ​​개의 병렬 단계 흐름을 처리하는 작업 실행자 (simpleAsyncTaskExecutor)를 사용하고 있습니다. 각 단계에서 스프링 배치 : 작업이 커밋 간격보다 적은 행으로 임의로 청크를 선택합니다.

가 작업 실행을 다른 스레드로 판독기에 의해 반환 된 데이터의 각각의 청크 분할 : 문제는 우리의 투입 간격이 큰 것을

을 (멀티 스레드 단계 개념을 사용하여 https://docs.spring.io/spring-batch/trunk/reference/html/scalability.html 참조) (24,000), 독자가 반환 할 행 수가 매우 적습니다 (50 행 미만).하지만 작성자는 때때로 두 개 이상의 청크를 수신합니다 (예 : 30 행의 청크와 20 행의 청크, 다른 실행 25 행의 덩어리와 25 행의 덩어리 또는 50 행의 하나의 덩어리 일 수 있습니다. 임의의 실행에 대해 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> 

답변

0
작성하는 레코드의 출원 수는 커밋 간격 (도달 할 때까지 메소드가 호출 할 수 없습니다()

작가의 쓰기 또는 청크 크기). 그 전에 호출되어야하는 유일한 시간은 read()가 결과가 더 이상 없음을 나타내는 판독기에서 null을 반환하는지 여부입니다.

작은 청크가 보이면 작업 중간에 있습니까? RowMappers 내에 어떤 논리가 있거나 읽지 않은 결과가 누락 된 항목이 있습니까?

+0

안녕하세요 Joe 님의 답변에 감사드립니다. 내 게시물에서 말했듯이,이 동작은 무작위로 보입니다 (때로는 독자가 50 개의 작은 덩어리를 보내면 좋은 동작, 때로는 2 개의 작은 덩어리). 어딘가에 어딘가에있는 어떤 버그보다 어딘가에있는 버그 같아 보입니다. PersonRowMapper는 행을 올바른 PersonBean에만 맵핑합니다. 독자가 read()를 수행 한 후에 writer의 write() 메서드가 호출되면 writer는 2 개의 스레드에서 1 개의 청크 또는 2 개의 작은 청크를받습니다. – rBenks93

관련 문제