2016-04-12 6 views
0

Ich versuche einige Daten Wartungsvorgänge mit Spring Batch (3.0.6) durchzuführen. Ich lese Daten von JPA (Hibernate 5.0.1-Implementierung), ändere es und versuche, es wieder mit JPA in die Datenbank zu speichern.Schreiben von Daten mit Spring Batch JpaItemWriter unvollständig

Die Jobausführung ist erfolgreich, aber nach einem Blick in die Datenbank sehe ich, dass nur wenige Einträge geändert wurden (ALLE Einträge sollten geändert worden sein). Es scheint, dass die Daten nicht korrekt geleert werden/die Transaktion wird nicht ausgeführt, die Protokollierung ergab, dass alle Elemente in dem entsprechenden Prozessor UND dem entsprechenden Schreiber verarbeitet werden.

Wahrscheinlich etwas aus über die transaction fehlt mir, aber ich habe eine harte Zeit, es heraus herauszufinden, wie der Job Kontext mich gesund aussieht:

<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> 

Die Implementierungen nicht mehr trivial sein könnte ich denke:

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) 
    { 
    } 
} 

ich bereits versucht, die entsprechenden Schreibverfahren in EntityWriter (doWrite und schreiben), ohne bemerkenswerten Erfolg zu überschreiben. Ich verwende CommandLineJobRunner, um den Code auszuführen.

EDIT: für insgesamt 64 Elemente, die ersten 60 Elemente werden korrekt aktualisiert, mit einer Commit-Intervall und Seitengröße von 10. Ich das Protokoll grep nur die interessanten Aussagen enthalten. Ich enthalten nur die letzten beiden pagereads (Stück 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] 

Antwort

0

Rufen Sie JpaItemWriter.write(List) innerhalb einer Transaktion?

ItemWriter, die eine JPA EntityManagerFactory wird unter Verwendung von Einrichtungen, zu verschmelzen, die nicht Teil des Persistenzkontext sind. Es ist erforderlich, dass write (List) innerhalb einer Transaktion aufgerufen wird. Der Reader muss mit einer EntityManagerFactory konfiguriert sein, die an Spring-Transaktionen teilnehmen kann. Der Writer ist Thread-sicher, nachdem seine Eigenschaften festgelegt wurden (normales Singleton-Verhalten), sodass er zum Schreiben in mehrere gleichzeitige Transaktionen verwendet werden kann.

Reference

+0

Werfen Sie einen Blick auf meine Macht die letzten bearbeiten. Ich habe die entsprechenden Log-Anweisungen hinzugefügt, die zeigen, dass Transaktionen verwendet werden. –

Verwandte Themen