首页 文章

Spring Boot如何运行批处理作业

提问于
浏览 1189
39

我跟着this sample进行了Spring Batch with Boot .

运行main方法时,将执行作业 . 这样我无法弄清楚如何控制作业执行 . 例如,您如何安排作业,或访问作业执行或设置作业参数 .

我试着注册我自己的JobLauncher

@Bean
public JobLauncher jobLauncher(JobRepository jobRepo){
    SimpleJobLauncher simpleJobLauncher = new SimpleJobLauncher();
    simpleJobLauncher.setJobRepository(jobRepo);
    return simpleJobLauncher;
}

但是当我尝试在main方法中使用它时:

public static void main(String[] args) {
    ConfigurableApplicationContext ctx = SpringApplication.run(Application.class, args);    
    JobLauncher jobLauncher = ctx.getBean(JobLauncher.class);
    //try catch removed for readability
    jobLauncher.run(ctx.getBean(Job.class), new JobParameters());   
}

加载上下文时再次执行作业,当我尝试手动运行时,我得到 JobInstanceAlreadyCompleteException . 有没有办法阻止自动执行作业?

2 回答

  • 52

    可以通过设置来防止作业执行

    spring.batch.job.enabled=false
    

    在application.properties中 . 或者您可以使用 spring.batch.job.names 它将以逗号分隔的作业名称列表进行运行 .

    取自这里:how to stop spring batch scheduled jobs from running at first time when executing the code?

  • 0

    您可以使用rest controller POST启用Job的执行:

    @RestController
    @RequestMapping(value="/job/")
    public class JobLauncherController {
    
        private static final Log LOG = LogFactory.getLog(JobLauncherController.class);
    
        @Autowired
        private JobLauncher jobLauncher;
    
        @Autowired
        private Job job;
    
        @Autowired
        private JobRepository jobRepository;
    
        @Autowired
        private JobRegistry jobRegistry;
    
        @RequestMapping("/launchjob/{jobName}")
        public String handle(@PathVariable("jobName") String jobName, @RequestBody Map<String,Object> request) throws Exception {
            try {           
                request.put("timeJobStarted", DateUtil.getDateFormatted(new Date(), DateUtil.DATE_UUUUMMDDHHMMSS));
                Map<String,Object> mapMessage = this.enrichJobMessage(request);
                Map<String, JobParameter> jobParameters = new HashMap<>();
                mapMessage.forEach((k,v)->{
                    MapperUtil.castParameter(jobParameters, k, v);
                });
                jobParameters.put(Field.Batch.JOB_INSTANCE_NAME, new JobParameter(jobName));
                jobLauncher.run(job, new JobParameters(jobParameters));
                assertNotNull(jobRegistry.getJob(job.getName()));
            }catch( NoSuchJobException ex){
                jobRegistry.register(new ReferenceJobFactory(job));
            } catch (Exception e) {
                LOG.error(e.getMessage(),e);
            }
    
            return "Done";
        }
    
    public static void castParameter(Map<String, JobParameter> jobParameters, String k, Object v){
        if(v instanceof String){
            jobParameters.put(k, new JobParameter((String)v));
        }else if(v instanceof Date){
            jobParameters.put(k, new JobParameter((Date)v));
        }else if(v instanceof Double){
            jobParameters.put(k, new JobParameter((Double)v));
        }else if(v instanceof Long){
            jobParameters.put(k, new JobParameter((Long)v));
        }else{
            DslJson dslJson = new DslJson<>();          
            JsonWriter writer = dslJson.newWriter();
            try {
                dslJson.serialize(writer,v);
                jobParameters.put(k, new JobParameter(writer.toString()));
            } catch (IOException e) {
                LOG.warn(e.getMessage(), e);
            }                       
        }
    }
    
    }
    

相关问题