Nous vérifierons la méthode de mise en œuvre pour les types en deux étapes de Spring Batch. Cette fois, il sera réalisé par annotation Java.
Il existe deux principaux types d'étapes. «Étapes réservées aux tâches» et «étapes de bloc». Jetons un bref coup d'œil à chacun d'entre eux ci-dessous.
Tasklet seulement étapes
Chunk étapes
Windows 10 JDK 1.8.0_251 STS 4.6.2
Créez un «projet Spring Starter». Lors de la création d'un projet, lorsqu'il s'agit d'une dépendance, sélectionnez uniquement "Spring Batch".
pom.xml
<dependency>
<groupId>org.hsqldb</groupId>
<artifactId>hsqldb</artifactId>
<scope>runtime</scope>
</dependency>
BatchTestAppApplication.java
@SpringBootApplication
public class BatchTestAppApplication {
public static void main(String[] args) {
SpringApplication.run(BatchTestAppApplication.class, args);
}
}
schema-all.sql
DROP TABLE people IF EXISTS;
CREATE TABLE people (
person_id BIGINT IDENTITY NOT NULL PRIMARY KEY,
first_name VARCHAR(20),
last_name VARCHAR(20)
);
sample-data.csv
Jill,Doe
Joe,Doe
Justin,Doe
Jane,Doe
John,Doe
Person.java
public class Person {
private String lastName;
private String firstName;
public Person() {
}
public Person(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
@Override
public String toString() {
return "firstName: " + firstName + ", lastName: " + lastName;
}
}
PersonItemProcessor.java
public class PersonItemProcessor implements ItemProcessor<Person, Person> {
private static final Logger log = LoggerFactory.getLogger(PersonItemProcessor.class);
@Override
public Person process(final Person person) throws Exception {
final String firstName = person.getFirstName().toUpperCase();
final String lastName = person.getLastName().toUpperCase();
final Person transformedPerson = new Person(firstName, lastName);
log.info("Converting (" + person + ") into (" + transformedPerson + ")");
return transformedPerson;
}
}
Implémentez la méthode de processus. Modifiez le nom simple en majuscules. Un journal d'informations est généré pour vérifier l'historique d'exécution.
Implémentez la méthode afterJob de JobExecutionListenerSupport pour vérifier le résultat de l'exécution du travail.
JobCompletionNotificationListener.java
@Component
public class JobCompletionNotificationListener extends JobExecutionListenerSupport {
private static final Logger log = LoggerFactory.getLogger(JobCompletionNotificationListener.class);
private final JdbcTemplate jdbcTemplate;
@Autowired
public JobCompletionNotificationListener(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
@Override
public void afterJob(JobExecution jobExecution) {
if (jobExecution.getStatus() == BatchStatus.COMPLETED) {
log.info("!!! JOB FINISHED! Time to verify the results");
jdbcTemplate
.query("SELECT first_name, last_name FROM people",
(rs, row) -> new Person(rs.getString(1), rs.getString(2)))
.forEach(person -> log.info("Found <" + person + "> in the database."));
}
}
}
BatchConfiguration.java
@Configuration
@EnableBatchProcessing
public class BatchConfiguration {
private static final Logger log = LoggerFactory.getLogger(BatchConfiguration.class);
@Autowired
public JobBuilderFactory jobBuilderFactory;
@Autowired
public StepBuilderFactory stepBuilderFactory;
@Bean
public FlatFileItemReader<Person> reader() {
return new FlatFileItemReaderBuilder<Person>().name("personItemReader")
.resource(new ClassPathResource("sample-data.csv")).delimited()
.names(new String[] { "firstName", "lastName" })
.fieldSetMapper(new BeanWrapperFieldSetMapper<Person>() {
{
setTargetType(Person.class);
}
}).build();
}
@Bean
public PersonItemProcessor processor() {
return new PersonItemProcessor();
}
@Bean
public JdbcBatchItemWriter<Person> writer(DataSource dataSource) {
return new JdbcBatchItemWriterBuilder<Person>()
.itemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>())
.sql("INSERT INTO people (first_name, last_name) VALUES (:firstName, :lastName)").dataSource(dataSource)
.build();
}
@Bean
public Job importUserJob(JobCompletionNotificationListener listener, Step step1) {
return jobBuilderFactory.get("importUserJob").incrementer(new RunIdIncrementer()).listener(listener).flow(step1)
.end()
.build();
}
@Bean
public Step step1(JdbcBatchItemWriter<Person> writer) {
return stepBuilderFactory.get("step1").<Person, Person>chunk(10).reader(reader()).processor(processor())
.writer(writer).build();
}
}
Renvoie FlatFileItemReader comme ItemReader. Lit les données dans le fichier CSV d'entrée et les stocke dans le Bean DTO Person. 2. processor
Renvoyez PersonItemProcessor comme ItemProcessor. 3. writer
Renvoie JdbcBatchItemWriter comme ItemWriter. Stocke le résultat du traitement de Item Processor dans DB. 4. step1
Liez FlatFileItemReader, PersonItemProcessor et JdbcBatchItemWriter avec StepBuilderFactory pour générer un bean step chunk pour Spring Batch. 5. importUserJob
Générez un Job Spring Batch à l'aide du JobCompletionNotificationListener Bean personnalisé et du Bean étape de bloc généré à l'étape 1. Lorsque vous démarrez le lot correspondant, vous pouvez exécuter le Job généré par cette méthode.
Tirez parti du projet ci-dessus pour modifier BatchConfiguration afin d'implémenter l'exemple d'étape de tasklet. L'étape de tasklet correspondante exécute la commande du système d'exploitation.
--Générer le bean tasklet
python
@Bean
public Tasklet copyFile() {
log.info("Start FileCopy");
SystemCommandTasklet tasklet = new SystemCommandTasklet();
tasklet.setCommand("cmd /C copy C:\\data\\test.txt C:\\data\\test2.txt");
tasklet.setTimeout(3000);
return tasklet;
}
--step Bean génération
python
@Bean
public Step step2() {
return stepBuilderFactory.get("step2").tasklet(copyFile()).build();
}
--Créer un emploi
python
@Bean
public Job cmdJob(JobCompletionNotificationListener listener, Step step1, Step step2, Step step3) {
return jobBuilderFactory.get("cmdJob").incrementer(new RunIdIncrementer()).listener(listener).
flow(step2)
.end()
.build();
}
Creating a Batch Service [Java] [Spring Boot] Essayez d'utiliser Tasklet avec Spring Batch
Recommended Posts