弹簧批注释

时间:2014-02-21 19:12:25

标签: spring spring-batch spring-annotations

我目前正在尝试使用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());

}
}

1 个答案:

答案 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提供一个真实的数据库,然后检查其中的执行状态。