春季批处理:如果作业正在运行,请避免运行作业



我从两个入口点启动我的作业:

  • 来自"@Scheduled"
  • 从控制器端点

这里是我的JobService:

@Service
public class JobService {
private static final Logger logger = LoggerFactory.getLogger(JobService.class);
private JobLauncher jobLauncher;
private Job giacTxtJob;
private Job giacImgJob;
public JobService(
JobLauncher jobLauncher,
@GiacImg Job giacImgJob,
@GiacTxt Job giacTxtJob
) {
this.jobLauncher = jobLauncher;
this.giacImgJob = giacImgJob;
this.giacTxtJob = giacTxtJob;
}
/**
*
*/
@Scheduled(cron = "${connector.giac-img-cron}")
public void giacImg() {
JobService.logger.debug("Launching giac img job...");
try {
this.jobLauncher.run(giacImgJob, new JobParameters());
} catch (JobExecutionAlreadyRunningException | JobRestartException | JobInstanceAlreadyCompleteException
| JobParametersInvalidException ex) {
throw new ConnectorFault("Something wrong launching giac img job", ex);
}
JobService.logger.debug("Giac img as gone...");
}
/**
*
*/
@Scheduled(cron = "${connector.giac-txt-cron}")
public void giacTxt() {
JobService.logger.debug("Launching giac txt job...");
try {
this.jobLauncher.run(giacTxtJob, new JobParameters());
} catch (JobExecutionAlreadyRunningException | JobRestartException | JobInstanceAlreadyCompleteException
| JobParametersInvalidException ex) {
throw new ConnectorFault("Something wrong launching giac img job", ex);
}
JobService.logger.debug("Giac txt as gone...");
}
}

如您所见,JobService.giacImgJobService.giacTxt都是@Scheduled

另一方面,这里是我的控制器:


@RestController
@RequestMapping(ControllerConstants.Job.BASE)
public class ConnectorControllerImpl implements ConnectorController{
private JobService jobService;
public ConnectorControllerImpl(JobService jobService) {
this.jobService = jobService;
}
/**
* {@inheritDoc}
*/
@Override
@PostMapping(ControllerConstants.Job.GANCIMG)
public void giacImg() {
this.jobService.giacImg();
}
/**
* {@inheritDoc}
*/
@Override
@PostMapping(ControllerConstants.Job.GANCTXT)
public void giacTxt() {
this.jobService.giacTxt();
}
}

如果作业一直在运行,我需要避免执行该作业。

有什么想法吗?

如果传递的参数完全相同,则Spring批处理作业不会运行。但如果您打算检查某些参数是否已经有一个正在执行的作业,则可以使用JobExecutionDao查询BATCH_JOB_EXECUTION以查找正在运行的实例。

JobExecutionDao的API。

最新更新