2015-02-17 19 views
9

Tôi đang cố gắng chạy lệnh batch của mình từ bộ điều khiển. Nó sẽ được kích hoạt bởi công việc cron hoặc bằng cách truy cập một liên kết cụ thể. Tôi đang sử dụng Khởi động mùa xuân, không có chú thích chỉ XML. Trong bối cảnh hiện tại của tôi, tôi có một dịch vụ có chứa đậu sau:chạy công việc hàng loạt mùa xuân từ bộ điều khiển

@EnableBatchProcessing 
@PersistenceContext 
public class batchService{ 

@Bean 
public ItemReader<Somemodel> reader() { 
... 
} 

@Bean 
    public ItemProcessor<Somemodel, Somemodel> processor() { 
     return new SomemodelProcessor(); 
    } 
@Bean 
    public ItemWriter writer() { 
     CustomItemWriter writer = new CustomItemWriter(); 
      return writer; 
    } 
@Bean 
    public Job importUserJob(JobBuilderFactory jobs, Step s1) { 
     return jobs.get("importUserJob") 
       .incrementer(new RunIdIncrementer()) 
       .flow(s1) 
       .end() 
       .build(); 
    } 

@Bean 
public Step step1(StepBuilderFactory stepBuilderFactory,  
ItemReader<somemodel> reader, 
      ItemWriter<somemodel> writer, ItemProcessor<somemodel, 
somemodel> processor) { 
     return stepBuilderFactory.get("step1") 
       .<somemodel, somemodel> chunk(100) 
       .reader(reader) 
       .processor(processor) 
       .writer(writer) 
       .build(); 
    } 
} 

Ngay sau khi tôi đưa @Configuration chú thích trên đầu trang của lớp batchService của tôi, công việc sẽ bắt đầu ngay sau khi tôi chạy ứng dụng. Nó thành công, mọi thứ đều ổn. Bây giờ tôi đang cố gắng loại bỏ chú thích @Configuration và chạy nó bất cứ khi nào tôi muốn. Có cách nào để bắn nó từ bộ điều khiển không?

Cảm ơn!

Trả lời

12

Bạn có thể khởi chạy công việc hàng loạt bằng cách sử dụng JobLauncher. Xem Spring Batch documentation để biết thêm chi tiết, bao gồm bộ điều khiển ví dụ này:

@Controller 
public class JobLauncherController { 

    @Autowired 
    JobLauncher jobLauncher; 

    @Autowired 
    Job job; 

    @RequestMapping("/jobLauncher.html") 
    public void handle() throws Exception{ 
     jobLauncher.run(job, new JobParameters()); 
    } 
} 
+0

Ive nhìn thấy JobLauncher trước đây, nhưng tôi không biết làm thế nào để thiết lập nó để nó biết whitch công việc để chạy (importUserJob trong trường hợp của tôi mà mất 2 thông số). Tôi có phải tạo Bean CustomJobLauncher, đặt nó ở đó và sau đó tiêm CustomJobLauncher của tôi không? Hiện tại chỉ sau khi tiêm JobLauncher theo lời khuyên của bạn, tôi nhận được Không có loại đậu đủ điều kiện nào loại [org.springframework.batch.core.launch.JobLauncher] được tìm thấy cho sự phụ thuộc – Damian

+1

Miễn là bạn có một lớp '@ Configuration' được chú thích bằng' @EnableBatchProcessing 'một' JobLauncher' đậu nên được tạo tự động –

+0

tuyệt vời, cảm ơn bạn! – Damian

2

Vì bạn đang sử dụng Khởi động mùa xuân, bạn nên để chú thích @Configuration ở đó và thay vào đó định cấu hình ứng dụng của bạn.properties để không khởi chạy công việc khi khởi động. Bạn có thể đọc thêm về các tùy chọn tự động định cấu hình để chạy các công việc khi khởi động (hoặc không) trong tài liệu Khởi động Spring tại đây: http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#howto-execute-spring-batch-jobs-on-startup

13

Bạn cần phải tạo một tập tin application.yml trong src/main/nguồn lực và thêm cấu hình sau:

spring.batch.job.enabled: false 

Với sự thay đổi này , lệnh in sẽ không tự động thực thi khi khởi động Spring Boot. Và công việc hàng loạt sẽ được kích hoạt khi liên kết cụ thể.

Kiểm tra mẫu mã của tôi ở đây: https://github.com/pauldeng/aws-elastic-beanstalk-worker-spring-boot-spring-batch-template

Các vấn đề liên quan