Comment lancer les travaux par lots
j'ai suivi cet échantillon pour le Lot de ressorts avec botte.
lorsque vous exécutez la méthode principale, le travail est exécuté. Comme ça, Je ne vois pas comment on peut contrôler l'exécution du travail. Par exemple, comment programmer une tâche, ou accéder à l'exécution de la tâche, ou définir les paramètres de la tâche.
j'ai essayé d'enregistrer mon propre JobLauncher
@Bean
public JobLauncher jobLauncher(JobRepository jobRepo){
SimpleJobLauncher simpleJobLauncher = new SimpleJobLauncher();
simpleJobLauncher.setJobRepository(jobRepo);
return simpleJobLauncher;
}
mais quand j'essaie de l'utiliser dans la méthode 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());
}
Le travail est de nouveau exécutée lorsque le contexte est chargé et j'ai eu JobInstanceAlreadyCompleteException
quand j'essaie de le lancer manuellement.
Est-il possible d'empêcher l'emploi automatique de l'exécution?
2 réponses
l'exécution des travaux peut être empêchée en réglant
spring.batch.job.enabled=false
en application.propriété. Ou vous pouvez utiliser spring.batch.job.names
il prend une liste délimitée par une virgule des noms de tâches qui seront exécutées.
vous pouvez activer l'exécution d'une tâche en utilisant le poste de contrôleur rest:
@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);
}
}
}
}