1
현재 스프링 주석을 사용하여 배치를 만들려고하지만 배치가 호출되지 않습니다. 오류가 발생하지 않고 일괄 처리가 호출되지 않습니다. 데이터베이스에서 값을 검색하고 대기열 (rabbitmq)에 메시지를 추가하는 간단한 배치입니다.주석이있는 스프링 배치
주요 구성 클래스 : 내 배치에 특정
@Configuration
@EnableBatchProcessing
public class BatchInfrastructureConfiguration {
@Bean
public JobLauncher getJobLauncher() throws Exception {
SimpleJobLauncher jobLauncher = new SimpleJobLauncher();
jobLauncher.setJobRepository(getJobRepository());
jobLauncher.afterPropertiesSet();
return jobLauncher;
}
public JobRepository getJobRepository() throws Exception {
MapJobRepositoryFactoryBean factory = new MapJobRepositoryFactoryBean();
factory.setTransactionManager(new ResourcelessTransactionManager());
factory.afterPropertiesSet();
return (JobRepository) factory.getObject();
}
}
구성 클래스
@Configuration
@Import(BatchInfrastructureConfiguration.class)
public class PurchaseStatusBatchConfiguration {
@Inject
private JobBuilderFactory jobBuilders;
@Inject
private StepBuilderFactory stepBuilders;
@Bean
public Job purchaseStatusJob(){
return jobBuilders.get("purchaseStatusJob")
.start(step())
.build();
}
@Bean
public Step step(){
return stepBuilders.get("purchaseStatusStep")
.tasklet(new PurchaseStatusBatch())
.build();
}
}
배치 클래스 :
public class PurchaseStatusBatch implements Tasklet {
@Inject
private PurchaseRepository purchaseRepository;
@Inject
@Qualifier(ApplicationConst.BEAN_QUALIFIER_PURCHASE_QUEUE)
private RabbitTemplate rabbitTemplate;
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
PurchaseDto purchaseDto;
PurchaseMessage purchaseMessage;
List<Purchase> notVerifiedPurchase = purchaseRepository.findByVerified(false);
for (Purchase purchase : notVerifiedPurchase) {
purchaseDto = new PurchaseDto();
purchaseDto.setOrderId(purchase.getOrderId());
purchaseDto.setProductId(purchase.getProductId());
purchaseDto.setPurchaseToken(purchase.getPurchaseToken());
purchaseDto.setUserScrapbookKey(purchase.getUserScrapbookKey());
purchaseMessage = new PurchaseMessage();
purchaseMessage.setPurchaseDto(purchaseDto);
rabbitTemplate.convertAndSend(purchaseMessage);
}
return null;
}
}
작업 러너 (클래스 배치를 호출) :
@Service
public class PurchaseStatusJobRunner {
@Inject
private JobLocator jobLocator;
@Inject
private JobLauncher jobLauncher;
//@Scheduled(fixedDelay = 3000L)
//@Scheduled(cron="* * * * *") // every 1 minute
@Scheduled(fixedDelay = 3000L)
public void runJob() throws JobExecutionAlreadyRunningException, JobRestartException, JobInstanceAlreadyCompleteException, JobParametersInvalidException, NoSuchJobException {
jobLauncher.run(jobLocator.getJob("purchaseStatusJob"), new JobParameters());
}
}