Spring-boot-integration mit spring batch und jpa
Ich bin für die Integration einer spring-boot-Projekt mit spring batch und data jpa-Projekt . Alle Sachen in Bezug auf Beruf und Daten-Konfiguration richtig ist, außer die anhaltende meinen job Schriftsteller Ergebnis in der Datenbank . nachdem ich eine Datei Lesen und verarbeiten zu können , ich kann nicht schreiben Sie es auf die mysql-Datenbank . Es ist kein Fehler, aber kein einfügen zu . interessant daran ist, dass meine Datenquelle konfiguriert ist . da vor dem einsetzen , kann ich Holen Sie sich eine Beispiel-Datensatz aus der Datenbank .bitte helfen Sie mir dieses problem zu lösen.
meiner Anwendung.Eigenschaften :
spring.datasource.url = jdbc:mysql://localhost:3306/batchtest? characterEncoding=UTF-8&autoReconnect=true
spring.datasource.username = root
spring.datasource.password = root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
batch-Konfiguration:
@Configuration
@EnableBatchProcessing
public class BatchConfiguration {
@Autowired
public JobBuilderFactory jobBuilderFactory;
@Autowired
public StepBuilderFactory stepBuilderFactory;
@Bean
public ResourcelessTransactionManager transactionManager() {
return new ResourcelessTransactionManager();
}
@Bean
public JobRepository jobRepository(ResourcelessTransactionManager transactionManager) throws Exception {
MapJobRepositoryFactoryBean mapJobRepositoryFactoryBean = new MapJobRepositoryFactoryBean(transactionManager);
mapJobRepositoryFactoryBean.setTransactionManager(transactionManager);
return mapJobRepositoryFactoryBean.getObject();
}
@Bean
public SimpleJobLauncher jobLauncher(JobRepository jobRepository) {
SimpleJobLauncher simpleJobLauncher = new SimpleJobLauncher();
simpleJobLauncher.setJobRepository(jobRepository);
return simpleJobLauncher;
}
@Bean
public FlatFileItemReader<Person> reader() {
FlatFileItemReader<Person> reader = new FlatFileItemReader<Person>();
reader.setResource(new ClassPathResource("sample-data.csv"));
reader.setLineMapper(new DefaultLineMapper<Person>() {{
setLineTokenizer(new DelimitedLineTokenizer() {{
setNames(new String[] { "firstName", "lastName" });
}});
setFieldSetMapper(new BeanWrapperFieldSetMapper<Person>() {{
setTargetType(Person.class);
}});
}});
return reader;
}
@Bean
public PersonItemProcessor processor() {
return new PersonItemProcessor();
}
@Bean
public ItemWriter<Person> writer() throws Exception {
return new PersonWriter();
}
@Bean
public Job importUserJob() throws Exception{
return jobBuilderFactory.get("importUserJob")
.incrementer(new RunIdIncrementer())
.flow(step1())
.end()
.build();
}
@Bean
public Step step1() throws Exception{
return stepBuilderFactory.get("step1")
.<Person, Person> chunk(1)
.reader(reader())
.processor(processor())
.writer(writer())
.build();
}
Dao-Klasse :
public interface PersonDao extends CrudRepository<Person,Integer> {
}
writer-Klasse :
public class PersonWriter implements ItemWriter<Person> {
@Autowired
PersonDao personDao;
@Override
public void write(List<? extends Person> items) throws Exception {
LOGGER.info("Received the information of {} students", items.size());
for(Person person:items)
{
LOGGER.info(String.format("inserting for customre %s %s", person.getFirstName(), person.getLastName()));
Person tempPerson = personDao.findOne(1);
personDao.save(person) ;
LOGGER.info(String.format("person id : %d",person.getId()));
}
}
tempPerson ist ein Objekt für die Prüfung der jpa-Daten . es holt ein person-Objekt mit id 1 aus der Datenbank aber in der nächsten Zeile gibt es kein einfügen in Datenbank und kein Fehler. nur die Ausführung der Linie und weiterhin die Schleife.
- Ich stehe vor einem ähnlichen Problem. Ein update auf diese Frage?
- Ich weiß nichts über Spring batch, aber mit einem ResourceLessTransactionManager und ein MapJobRepositoryFactory dokumentiert ist, wie "in-memory-Persistenz-und Test-Zwecke" (docs.Frühling.io/spring-batch/trunk/Referenz/htmlsingle/...). Versuchen Sie es mit einem JPA transaction manager und einem echten JobRepository.
- Du hast Recht, ich sollte Lesen Sie den Beitrag sorgfältig. Meine Frage ist daher anders. Ich bin wie es hier: stackoverflow.com/questions/38287298
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einer Lösung für dieses problem vielleicht näher als erwartet. Hast du einfach versuchen, ändern Sie den Namen des transactionManager bean? Mit einem anderen Namen, es wird nicht standardmäßig verwendet werden, die von Spring Data JPA.
Ich reproduziert Ihr problem und dann habe ich einfach umgestellt von daher:
zu diesem:
Und meiner Meinung nach, dass das problem gelöst ist. Denken Sie daran, dass "transactionManager" ist das Standard-bean name für transactionManager in Spring Data JPA (zumindest soweit ich das verstanden habe, Spring Boot automatisch konfiguriert, es sei denn, es findet eine Bean mit diesem Namen, und wenn es das tut, verwendet er die eine gefunden-und Ihre Datenbank-Transaktionen gehen durch eine Resourceless ein).
Können Sie auch diesen Schritt überspringen:
und rufen Sie die Bohnen direkt (nur um 'mehr wissen', dass eine ordnungsgemäße Transaktion Manager mit Batch):
Lassen Sie mich wissen, wenn Sie es testen, und ich hoffe, dass es das Hauptproblem 🙂
Vielleicht habe ich es verpasst, aber ich sehe nicht, wo Sie angeben, was mit DB-Zugriff-Methode, die Sie verwenden (JPA, Hibernate, JDBC, etc.). Ich gehe davon aus, JPA, aber ich denke, Ihr ItemWriter muss zum ausbau der DB-aware ItemWriters (RepositoryItemWriter,JpaItemWriter,JdbcBatchItemWriter, HibernateItemWriter). Die Basis ItemWriter erwartet Sie zum verwalten der Transaktion und alle Ressourcen selbst. Versuchen Sie es mit RepositoryItemWriter (oder je nachdem, was angemessen ist) statt. Sie können eine EntityManager und stellen Sie sicher, schreiben, Aufruf innerhalb einer Transaktion (z.B. einige
@Transactional
- Methode).