У меня есть пакетное задание Spring, которое работает следующим образом:
public void myMethod() throws JobParametersInvalidException, JobExecutionAlreadyRunningException, JobRestartException, JobInstanceAlreadyCompleteException {
logger.log("Job Starting");
JobParameters param = new JobParametersBuilder()
.addString("JobID", String.valueOf(System.currentTimeMillis()))
.toJobParameters();
jobLauncher.run(myJob(), param);
logger.log("Job Finished");
}
Это выполняется асинхронно с использованием TaskExecutor. Таким образом, второй logger.log регистрируется сразу после вызова задания.
Я хочу, чтобы журнал регистрировался после завершения myJob().
Я попытался изменить реальную работу, чтобы сделать это, но это не кажется лучшим решением. Я также пробовал искать такие методы, как andThen и onComplete, но ничего не нашел.
Есть ли способ сделать это?




Возможно, вы захотите взглянуть на JobExecutionListener, который позволяет вам выполнять некоторую обработку до и после выполнения задания.
public class DoSomethingAroundJob implements JobExecutionListener {
public void beforeJob(JobExecution jobExecution) {
System.out.println("Called beforeJob().");
}
public void afterJob(JobExecution jobExecution) {
System.out.println("Called afterJob().");
}
}
Затем вам нужно будет настроить Job для использования этого прослушивателя. Например.
@Bean
public Job myJob(){
return jobs.get("myJob")
.listener(new DoSomethingAroundJob())
.build();
}
Могут быть и другие части вашей работы, но выше просто показан пример добавления слушателя с JavaConfig.
Второй ответ: вот как я бы реализовал вариант использования в вопросе.