您好我有一个创建数据库条目的方法。 之后,第二个方法读取此数据库条目。
public IfdmJob startIfdmRun(Scenario scenario) throws IfdmConfException {
scenario.valideerVoorIfdm();
try {
IfdmJob ifdmJob = createIfdmJob(scenario); // CREATES A JOB ENTRY IN THE DATABASE
startJob(ifdmJob); // READS THE JOB ENTRY
return ifdmJob;
} catch (Exception e) {
log.error("Failed to start ifdm run", e);
throw new IfdmConfException(IfdmConfException.Message.GENERAL);
}
}
private void startJob(IfdmJob ifdmJob) {
ifdmWorkerService.startJob(ifdmJob);
}
private IfdmJob createIfdmJob(Scenario scenario) throws IOException, InvalidValueException {
removeRunningIfdmJobs(scenario);
IfdmRun ifdmRun = new IfdmRun(scenario);
byte[] zipFile = createIfdmZipFile(ifdmRun);
IfdmJob ifdmJob = new IfdmJob(scenario, zipFile, userService.getLoggedInUser().getUsername());
return entiteitService.create(ifdmJob);
}
我遇到的问题是createIfdmJob方法的提交尚未完成,因此startJob会查找该条目,但无法找到它并取消该作业。
他们是我能做到的一种方式 确保startjob方法仅在createIfdmJob的提交被触发时才开始? Thx提前
答案 0 :(得分:2)
您显然正在使用一堆内部类(如IfdmJob
和IfdmWorkerService
)实现多线程。我们不知道您的内部框架可以做什么,不能做什么,但似乎他们复制了Java标准类Runnable和ExecutorService的功能。
Java标准类通过让ExecutorService.submit(Runnable)
返回Future来解决此问题,然后您可以调用.get()
,阻止任务完成。
另一种解决方案是修改ifdmWorkerService.startJob
以将Runnable
作为可选的第二个参数,并在第一个作业完成时让它执行该Runnable。此模式称为callback method。