Spring Boot 如何运行批处理作业

2022-09-01 01:33:17

我按照此示例进行了带 Boot 的 Spring Batch。

运行 main 方法时,将执行作业。这样我就无法弄清楚如何控制作业执行。例如,如何计划作业,或获取对作业执行的访问权限,或设置作业参数。

我试图注册我自己的工作启动器

@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


答案 1

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

spring.batch.job.enabled=false

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

从这里开始:如何停止在执行代码时首次运行spring批处理计划作业?


答案 2

您可以使用 rest 控制器 POST 启用作业的执行:

@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);
        }                       
    }
}

}

推荐