我目前正在尝试使用spring注释创建批处理,但从不调用批处理。没有错误,我的批次没有被调用。它是一个简单的批处理,它从数据库中检索值并在队列中添加消息(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());
}
}
答案 0 :(得分:0)
简短回答:问题是你的PurchaseStatusBatch
实例不是一个spring bean ...然后它的所有属性都是null(它们没有被注入)
试试这个:
@Bean
public Step step(){
return stepBuilders.get("purchaseStatusStep")
.tasklet(purchaseStatusBatch())
.build();
}
@Bean
public PurchaseStatusBatch purchaseStatusBatch() {
return new PurchaseStatusBatch()
}
如果您想获得有关作业执行的反馈,只需使用JobExecution
返回的JobLauncher
实例即可。您可以获取ExitStatus
,您可以获取JobLauncher
捕获的所有例外情况,以及更多信息。
获得反馈的另一个解决方案是为JobRepository提供一个真实的数据库,然后检查其中的执行状态。