读取时使用JPAPAGINGITEMREADER从查询中省略的记录

时间:2018-11-07 16:02:00

标签: spring-batch

<batch:job id="xyzJob" job-repository="jobRepository"
    incrementer="jobParametersIncrementerImpl" restartable="false">
    <batch:step id="feeStep">
        <batch:tasklet transaction-manager="transactionManager" allow-start-if-complete="true">
            <batch:chunk reader="xyzReader" processor="xyzProcessor"
                writer="xyzWriter" commit-interval="4" >
                <batch:streams>
                    <batch:stream ref="fileWriter"/>
                </batch:streams>
            </batch:chunk>
            <batch:listeners>
                <batch:listener ref="stepExecutionListener"/>
            </batch:listeners>
        </batch:tasklet>
    </batch:step>
    <batch:listeners>
        <batch:listener ref="xyzJobListener" />
    </batch:listeners>
</batch:job>

<bean id="xyzProcessor" class="com.batch.core.processor.XYZProcessor" scope="step">
    <property name="fundDAO" ref="fundDAO"/>
    <property name="loanDAO" ref="loanDAO"/>
    <property name="aumBlnceDAO" ref="aumBalanceDAO"/>
    ---
    --
</bean> 


<bean id="xyzWriter" class="org.springframework.batch.item.support.CompositeItemWriter">
        <property name="delegates">
            <list>
                <bean class="com.batch.core.writer.xyzWriter">
                        <property name="xyzDetailsDomain" ref="xyzDetailsDomain" />
                        <property name="xyzHistoryDomain" ref="xyzHistoryDomain"></property>
                </bean>
                <ref bean="fileWriter"/>
            </list>
        </property>
</bean>

<bean id="xyzReader" class="org.springframework.batch.item.database.JpaPagingItemReader" scope="step">  
   <property name="entityManagerFactory" ref="batchEntityManagerFactoryBean"/> 
   <property name="queryString"> 
      <value><![CDATA[
              SELECT pe, pap 
              FROM A pe, B pap 
              WHERE pap.userID =pe.userID and pe.status = 'E' 
              and pe.startDT <= '#{jobExecutionContext[previousQuarterEndDate]}' 
              and (pe.endDT is null 
              or pe.endDT > '#{jobExecutionContext[previousQuarterEndDate]}')]]>
       </value>
   </property>  
   <property name="pageSize" value="1000"/> 
   <property name="saveState" value="false" /> 
</bean>

当这个春季批处理开始运行时,我注意到有时会从表中读取数据时跳过一些记录..这个问题并不一致...但是在10次中可能发生1次。

请帮助我解决此问题。预先谢谢。!

1 个答案:

答案 0 :(得分:0)

JpaPagingItemReader不会跳过记录。您的情况可能是在阅读器读取数据时添加了一些与您的搜索条件相对应的记录。这可能会导致错误的页面计算,并且似乎跳过了某些项目,但实际并非如此。

根据定义,批处理作业是作用于固定数据集的。如果在作业运行时查询返回固定的数据集,则每次作业运行都应返回相同的页面。另一方面,如果另一个进程插入了查询可以返回的数据,则可能会发生您的问题。

希望这会有所帮助。