Java Spring批处理在通过itemwriter类更新1000多条记录时停止

Java Spring批处理在通过itemwriter类更新1000多条记录时停止,java,spring-data-jpa,spring-batch,jpa-2.0,openjpa,Java,Spring Data Jpa,Spring Batch,Jpa 2.0,Openjpa,我使用SpringBatch通过JPAPagingItemReader和使用OpenJPA定制的Itemwriter类来读取和更新相同的DB表 但是,在尝试更新1000多条记录时,有些记录未更新,批处理停止,且批处理状态为停止、失败、未知(批处理过程中无异常) 下面是我在代码中所做的 1)读卡器- <beans:bean id="dataReader" class="org.springframework.batch.item.database.JpaPagingItemReader" s

我使用SpringBatch通过JPAPagingItemReader和使用OpenJPA定制的Itemwriter类来读取和更新相同的DB表

但是,在尝试更新1000多条记录时,有些记录未更新,批处理停止,且批处理状态为停止、失败、未知(批处理过程中无异常)

下面是我在代码中所做的

1)读卡器-

<beans:bean id="dataReader"
class="org.springframework.batch.item.database.JpaPagingItemReader" scope="step">
    <beans:property name="entityManagerFactory" ref="entityManagerFactory" />
    <beans:property name="pageSize" value="1"/>
    <beans:property name="queryString"
    value="select b from Test b where b.testStatus = #{jobParameters[status]}"/>  <!—here status value is ‘No’ -->
</beans:bean>

2)处理器– 执行某些业务逻辑取决于某些条件

3)作者–

<beans:bean id="dataWriter"
class="com.example.batch..DataWriter">
    <beans:property name="entityManager" ref="sharedEntityManager" />
</beans:bean>


公共类DataWriter实现ItemWriter{
私人实体管理者实体管理者;
公共实体管理器getEntityManager(){
返回此.entityManager;
}
公共无效设置EntityManager(EntityManager EntityManager){
this.entityManager=entityManager;
}
@交易的

公开无效写入(监听器每个东西看起来都很好-你真的在使用它吗-请分享你的作业和步骤级别配置-你也在使用-跳过限制,如果是,你设置了什么限制-跟踪跳过和失败的记录-你可以通过writer添加监听器-你可以使用onWriteError方法记录失败。期待看到e作业级别配置-
我没有使用任何跳过限制。我无法说明在尝试更新1000多条记录时失败的原因,但对于一些未更新的记录,您可以通过侦听器中的记录器实现来跟踪它们,writerListener和StepListener可能会帮助您找到roo不会引起
public class DataWriter implements ItemWriter<TestData> {
    private EntityManager entityManager;
    public EntityManager getEntityManager() {
        return this.entityManager;
    }

    public void setEntityManager(EntityManager entityManager) {
        this.entityManager = entityManager;
    }

    @Transactional
    public void write  (List<? extends TestData> items) {
        try {
            for (TestData testData : items) {
                updateTestDataStatus(testData.getTestDataKey());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private void updateTestDataStatus(String testDataKey) {
        Test test = getEntityManager().find(Test.class, testDataKey); //getEntityManager is sharedEntityManager
        test.setTestStatus("Yes");  
        getEntityManager().persist(test);
    }
}
<tx:annotation-driven transaction-manager="transactionManager" />
<beans:bean id="sharedEntityManager"
    class="org.springframework.orm.jpa.support.SharedEntityManagerBean">
    <beans:property name="entityManagerFactory" ref="entityManagerFactory" />
</beans:bean>

<!-- Configuration for JPATransaction Manager -->
<beans:bean id="transactionManager"
    class="org.springframework.orm.jpa.JpaTransactionManager">
    <beans:property name="entityManagerFactory" ref="entityManagerFactory" />
</beans:bean>

<!-- Configuration for EntityManager -->
<beans:bean id="entityManagerFactory"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <beans:property name="dataSource" ref="dataSource" />
    <beans:property name="persistenceUnitName" value="testdata-pu" />
    <beans:property name="jpaVendorAdapter">
        <beans:bean class="org.springframework.orm.jpa.vendor.OpenJpaVendorAdapter">
            <beans:property name="databasePlatform"
                value="org.apache.openjpa.jdbc.sql.OracleDictionary" />
            <beans:property name="database" value="ORACLE" />
            <beans:property name="showSql" value="true" />
        </beans:bean>
    </beans:property>
</beans:bean>

<!-- Configuration for Data Source -->
<beans:bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
    destroy-method="close">
    <beans:property name="driverClassName" value="${database.driverClassName}" />
    <beans:property name="url" value="${database.url}" />
    <beans:property name="username" value="${database.username}" />
    <beans:property name="password" value="${database.password}" />
</beans:bean>

<beans:bean id="dataSourcePropertiesplaceholder" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" >
    <beans:property name="location" value="classpath:datasource.properties"/>
</beans:bean>

<!-- jobRepository - in-memory mapping configuration -->
<beans:bean id="jobRepository"
    class="org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean">
    <beans:property name="transactionManager" ref="jobRepository-transactionManager" />
</beans:bean>

<beans:bean id="jobRepository-transactionManager"
    class="org.springframework.batch.support.transaction.ResourcelessTransactionManager" />