Я пытаюсь выполнить некоторые операции по обслуживанию данных с помощью 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]
Посмотрите на мой самый недавний редактирования. Я добавил соответствующие логарифмы, которые показывают, что используются транзакции. –