仅在上一个方法提交时运行方法

时间:2016-01-29 12:57:14

标签: java

您好我有一个创建数据库条目的方法。 之后,第二个方法读取此数据库条目。

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提前

1 个答案:

答案 0 :(得分:2)

您显然正在使用一堆内部类(如IfdmJobIfdmWorkerService)实现多线程。我们不知道您的内部框架可以做什么,不能做什么,但似乎他们复制了Java标准类RunnableExecutorService的功能。

Java标准类通过让ExecutorService.submit(Runnable)返回Future来解决此问题,然后您可以调用.get(),阻止任务完成。

另一种解决方案是修改ifdmWorkerService.startJob以将Runnable作为可选的第二个参数,并在第一个作业完成时让它执行该Runnable。此模式称为callback method