Job configuration, chunk processing, readers, writers, processors, and job execution.
@Configuration
@RequiredArgsConstructor
public class UserExportJobConfig {
private final JobRepository jobRepository;
private final PlatformTransactionManager transactionManager;
@Bean
public Job userExportJob(Step exportStep) {
return new JobBuilder("userExportJob", jobRepository)
.incrementer(new RunIdIncrementer())
.start(exportStep)
.build();
}
@Bean
public Step exportStep(
ItemReader<User> reader,
ItemProcessor<User, UserDto> processor,
ItemWriter<UserDto> writer) {
return new StepBuilder("exportStep", jobRepository)
.<User, UserDto>chunk(100, transactionManager)
.reader(reader)
.processor(processor)
.writer(writer)
.faultTolerant()
.skipLimit(10)
.skip(DataAccessException.class)
.build();
}
}
@Bean
public JpaPagingItemReader<User> userReader(EntityManagerFactory emf) {
return new JpaPagingItemReaderBuilder<User>()
.name("userReader")
.entityManagerFactory(emf)
.queryString("SELECT u FROM User u WHERE u.status = 'ACTIVE'")
.pageSize(100)
.build();
}
@Bean
public ItemProcessor<User, UserDto> userProcessor() {
return user -> new UserDto(user.getId(), user.getName(), user.getEmail());
}
@Bean
public FlatFileItemWriter<UserDto> userWriter() {
return new FlatFileItemWriterBuilder<UserDto>()
.name("userWriter")
.resource(new FileSystemResource("output/users.csv"))
.delimited()
.names("id", "name", "email")
.build();
}
@Service
@RequiredArgsConstructor
public class JobLauncherService {
private final JobLauncher jobLauncher;
private final Job userExportJob;
public void runExport(String date) throws Exception {
JobParameters params = new JobParametersBuilder()
.addString("date", date)
.addLong("time", System.currentTimeMillis())
.toJobParameters();
JobExecution execution = jobLauncher.run(userExportJob, params);
log.info("Job status: {}", execution.getStatus());
}
}
Search for places (restaurants, cafes, etc.) via Google Places API proxy on localhost.
Interact with GitHub using the `gh` CLI. Use `gh issue`, `gh pr`, `gh run`, and `gh api` for issues, PRs, CI runs, and advanced queries.
Create or update AgentSkills. Use when designing, structuring, or packaging skills with scripts, references, and assets.
Start voice calls via the OpenClaw voice-call plugin.
Notion API for creating and managing pages, databases, and blocks.
Gemini CLI for one-shot Q&A, summaries, and generation.
Category:developer