2014-02-21 4 views
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()); 

} 
} 

답변

0

짧은 답변 :

@Bean 
public Step step(){ 
    return stepBuilders.get("purchaseStatusStep") 
      .tasklet(purchaseStatusBatch()) 
      .build(); 
} 

@Bean 
public PurchaseStatusBatch purchaseStatusBatch() { 
    return new PurchaseStatusBatch() 
} 

언제 : 문제는 PurchaseStatusBatch 인스턴스가 ... 스프링 빈 아닌 다음의 모든 속성이 (가 주입되지 않은)

이 시도 널 있다는 것입니다 작업 실행에 대한 피드백을 받고 싶다면 JobLauncher이 반환 한 JobExecution 인스턴스를 사용하기 만하면됩니다. ExitStatus을 얻을 수 있으며 JobLauncher에 잡힌 모든 예외 사항과 자세한 정보를 얻을 수 있습니다.

피드백을받는 또 다른 솔루션은 JobRepository에 실제 데이터베이스를 제공 한 다음 그 안에 실행 상태를 확인하는 것입니다.