2016-04-12 3 views
0

Я пытаюсь выполнить некоторые операции по обслуживанию данных с помощью Spring Batch (3.0.6). Я читаю данные из JPA (реализация Hibernate 5.0.1), изменяю его и снова пытаюсь сохранить его обратно в базу данных с помощью JPA.Запись данных с использованием Spring Batch JpaItemWriter неполная

Выполнение задания выполнено успешно, однако, посмотрев на базу данных, я вижу, что только несколько записей были изменены (все записи должны быть изменены). Кажется, что данные не правильно очищены/транзакция не выполняется, протоколирование показало, что все элементы обрабатываются в соответствующем процессоре И соответствующем писателе.

Возможно я пропускаю что-то по поводу TransactionManager, но я с трудом выяснить это, как контекст работы выглядит вменяемым мне:

<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:batch="http://www.springframework.org/schema/batch" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.springframework.org/schema/batch http://www.springframework.org/schema/batch/spring-batch-3.0.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd"> 

    <bean id="jobRepository" class="org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean" /> 

    <bean id="jobLauncher" class="org.springframework.batch.core.launch.support.SimpleJobLauncher"> 
     <property name="jobRepository" ref="jobRepository" /> 
    </bean> 

    <bean id="jobListener" class="batch.enricher.JobListener" /> 

    <job id="hibernateJob" restartable="false" 
    xmlns="http://www.springframework.org/schema/batch"> 
     <step id="step1"> 
      <tasklet transaction-manager="transactionManager"> 
       <chunk reader="hibernateItemReader" processor="enrichmentProcessor" 
       writer="entityWriter" commit-interval="50"> 
       </chunk> 
      </tasklet> 
     </step> 
     <batch:listeners> 
      <batch:listener ref="jobListener" /> 
     </batch:listeners> 
    </job> 

    <bean id="entityManagerFactoryRegistry" class="database.EntityManagerFactoryRegistry" /> 

    <bean id="enrichmentProcessor" class="batch.enricher.EnrichmentProcessor" /> 

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
     <property name="entityManagerFactory" value="#{entityManagerFactoryRegistry.emf}" /> 
    </bean> 

    <bean id="entityWriter" class="batch.enricher.EntityWriter"> 
     <property name="entityManagerFactory" value="#{entityManagerFactoryRegistry.emf}" /> 
    </bean> 

    <bean id="hibernateItemReader" 
    class="org.springframework.batch.item.database.JpaPagingItemReader"> 
     <property name="queryString" value="from Relation" /> 
     <property name="entityManagerFactory" value="#{entityManagerFactoryRegistry.emf}" /> 
    </bean> 
</beans> 

Реализация не может быть более тривиальной Я думаю:

public class EntityWriter extends JpaItemWriter<Relation> { 
} 

public class EnrichmentProcessor implements ItemProcessor<Relation, Relation> 
{ 
    @Override 
    public Relation process(Relation item) throws Exception 
    { 
     // Do something with EACH item... 
     // Logging revealed that all items are correctly processed 
     return item; 
    } 
} 

public class JobListener implements JobExecutionListener 
{ 
    @Override 
    public void beforeJob(JobExecution jobExecution) 
    { 
     // Perform some trivial initializing... 
    } 

    @Override 
    public void afterJob(JobExecution jobExecution) 
    { 
    } 
} 

Я уже пытался переписать соответствующие методы письма в EntityWriter (doWrite и писать), без заметного успеха. Я использую CommandLineJobRunner для запуска кода.

EDIT: в общей сложности 64 пунктов, первые 60 пунктов обновляются правильно, используя размер страницы фиксации интервала и в 10. Я grepped журнал, чтобы включать только интересные заявления. Я только включал два последних pagereads (вещи 50 - 64)

[DEBUG] 2016-04-13 11:29:54.753 [main] JpaTransactionManager - Creating new transaction with name [null]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT 
[DEBUG] 2016-04-13 11:29:54.753 [main] JpaTransactionManager - Opened new EntityManager [[email protected]] for JPA transaction 
[DEBUG] 2016-04-13 11:29:54.754 [main] JpaPagingItemReader - Reading page 5 
[DEBUG] 2016-04-13 11:29:54.831 [main] JpaItemWriter - Writing to JPA with 10 items. 
[DEBUG] 2016-04-13 11:29:54.889 [main] JpaItemWriter - 10 entities merged. 
[DEBUG] 2016-04-13 11:29:54.889 [main] JpaItemWriter - 0 entities found in persistence context. 
[DEBUG] 2016-04-13 11:29:54.890 [main] ResourcelessTransactionManager - Creating new transaction with name [org.springframework.batch.core.repository.support.SimpleJobRepository.updateExecutionContext]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT 
[DEBUG] 2016-04-13 11:29:54.892 [main] ResourcelessTransactionManager - Initiating transaction commit 
[DEBUG] 2016-04-13 11:29:54.892 [main] ResourcelessTransactionManager - Committing resourceless transaction on [org.springframework.batch.support.tra[email protected]3d7c7168] 
[DEBUG] 2016-04-13 11:29:54.892 [main] ResourcelessTransactionManager - Resuming suspended transaction after completion of inner transaction 
[DEBUG] 2016-04-13 11:29:54.892 [main] ResourcelessTransactionManager - Creating new transaction with name [org.springframework.batch.core.repository.support.SimpleJobRepository.update]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT 
[DEBUG] 2016-04-13 11:29:54.898 [main] ResourcelessTransactionManager - Initiating transaction commit 
[DEBUG] 2016-04-13 11:29:54.899 [main] ResourcelessTransactionManager - Committing resourceless transaction on [org.springframework.batch.support.tra[email protected]337df06d] 
[DEBUG] 2016-04-13 11:29:54.899 [main] ResourcelessTransactionManager - Resuming suspended transaction after completion of inner transaction 
[DEBUG] 2016-04-13 11:29:54.899 [main] JpaTransactionManager - Initiating transaction commit 
[DEBUG] 2016-04-13 11:29:54.899 [main] JpaTransactionManager - Committing JPA transaction on EntityManager [[email protected]] 
[DEBUG] 2016-04-13 11:29:54.900 [main] JpaTransactionManager - Closing JPA EntityManager [[email protected]] after transaction 
[DEBUG] 2016-04-13 11:29:54.901 [main] JpaTransactionManager - Creating new transaction with name [null]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT 
[DEBUG] 2016-04-13 11:29:54.902 [main] JpaTransactionManager - Opened new EntityManager [[email protected]] for JPA transaction 
[DEBUG] 2016-04-13 11:29:54.904 [main] JpaPagingItemReader - Reading page 6 
[DEBUG] 2016-04-13 11:29:54.959 [main] JpaItemWriter - Writing to JPA with 4 items. 
[DEBUG] 2016-04-13 11:29:54.986 [main] JpaItemWriter - 4 entities merged. 
[DEBUG] 2016-04-13 11:29:54.986 [main] JpaItemWriter - 0 entities found in persistence context. 
[DEBUG] 2016-04-13 11:29:54.987 [main] ResourcelessTransactionManager - Creating new transaction with name [org.springframework.batch.core.repository.support.SimpleJobRepository.updateExecutionContext]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT 
[DEBUG] 2016-04-13 11:29:54.988 [main] ResourcelessTransactionManager - Initiating transaction commit 
[DEBUG] 2016-04-13 11:29:54.988 [main] ResourcelessTransactionManager - Committing resourceless transaction on [org.springframework.batch.support.tra[email protected]1d8fdd4f] 
[DEBUG] 2016-04-13 11:29:54.988 [main] ResourcelessTransactionManager - Resuming suspended transaction after completion of inner transaction 
[DEBUG] 2016-04-13 11:29:54.988 [main] ResourcelessTransactionManager - Creating new transaction with name [org.springframework.batch.core.repository.support.SimpleJobRepository.update]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT 
[DEBUG] 2016-04-13 11:29:54.991 [main] ResourcelessTransactionManager - Initiating transaction commit 
[DEBUG] 2016-04-13 11:29:54.991 [main] ResourcelessTransactionManager - Committing resourceless transaction on [org.springframework.batch.support.tra[email protected]1b446bed] 
[DEBUG] 2016-04-13 11:29:54.992 [main] ResourcelessTransactionManager - Resuming suspended transaction after completion of inner transaction 
[DEBUG] 2016-04-13 11:29:54.992 [main] JpaTransactionManager - Initiating transaction commit 
[DEBUG] 2016-04-13 11:29:54.992 [main] JpaTransactionManager - Committing JPA transaction on EntityManager [[email protected]] 
[DEBUG] 2016-04-13 11:29:54.994 [main] JpaTransactionManager - Closing JPA EntityManager [[email protected]] after transaction 
[DEBUG] 2016-04-13 11:29:54.995 [main] ResourcelessTransactionManager - Creating new transaction with name [org.springframework.batch.core.repository.support.SimpleJobRepository.updateExecutionContext]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT 
[DEBUG] 2016-04-13 11:29:54.996 [main] ResourcelessTransactionManager - Initiating transaction commit 
[DEBUG] 2016-04-13 11:29:54.997 [main] ResourcelessTransactionManager - Committing resourceless transaction on [org.springframework.batch.support.tra[email protected]5c2dd133] 
[DEBUG] 2016-04-13 11:29:54.997 [main] ResourcelessTransactionManager - Creating new transaction with name [org.springframework.batch.core.repository.support.SimpleJobRepository.update]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT 
[DEBUG] 2016-04-13 11:29:55.002 [main] ResourcelessTransactionManager - Initiating transaction commit 
[DEBUG] 2016-04-13 11:29:55.002 [main] ResourcelessTransactionManager - Committing resourceless transaction on [org.springframework.batch.support.tra[email protected]2bb9da60] 
[DEBUG] 2016-04-13 11:29:55.003 [main] ResourcelessTransactionManager - Creating new transaction with name [org.springframework.batch.core.repository.support.SimpleJobRepository.updateExecutionContext]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT 
[DEBUG] 2016-04-13 11:29:55.005 [main] ResourcelessTransactionManager - Initiating transaction commit 
[DEBUG] 2016-04-13 11:29:55.005 [main] ResourcelessTransactionManager - Committing resourceless transaction on [org.springframework.batch.support.tra[email protected]358cce2e] 
[DEBUG] 2016-04-13 11:29:55.008 [main] ResourcelessTransactionManager - Creating new transaction with name [org.springframework.batch.core.repository.support.SimpleJobRepository.update]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT 
[DEBUG] 2016-04-13 11:29:55.012 [main] ResourcelessTransactionManager - Initiating transaction commit 
[DEBUG] 2016-04-13 11:29:55.012 [main] ResourcelessTransactionManager - Committing resourceless transaction on [org.springframework.batch.support.tra[email protected]5875c7d8] 

ответ

0

ли вы называете JpaItemWriter.write(List) внутри транзакции?

ItemWriter, который использует JPA EntityManagerFactory для объединения любых объектов, которые не являются частью контекста персистентности. Необходимо, чтобы запись (список) вызывалась внутри транзакции. Читатель должен быть настроен с помощью EntityManagerFactory, который может участвовать в транзакциях, управляемых Spring. Считыватель является потокобезопасным после того, как его свойства установлены (обычное однопользовательское поведение), поэтому его можно использовать для записи в нескольких параллельных транзакциях.

Reference

+0

Посмотрите на мой самый недавний редактирования. Я добавил соответствующие логарифмы, которые показывают, что используются транзакции. –

Смежные вопросы