0

我正在编写一个 API,它接收关于何时何地发出 GET 请求的请求,然后将使用 Quartz 安排适当的时间来发出这些请求。目前,每次发出请求时,我都会调用 getDefaultScheduler,以便安排适当的作业和触发器。我现在将作业存储在内存中,但计划稍后使用 JDBC 存储作业。

这种方法安全吗?我们可以假设应用程序可能有许多并发请求,并且应用程序将确保不会有任何触发器和作业名称冲突。

4

1 回答 1

0

是的,它们是线程安全的。但请继续查看您正在使用的 JobStore 实现。这是用于存储作业的 DefaultClusteredJobStore 实现。

  public void storeJob(JobDetail newJob, boolean replaceExisting) throws ObjectAlreadyExistsException,
  JobPersistenceException {
JobDetail clone = (JobDetail) newJob.clone();

lock();
try {
  // wrapper construction must be done in lock since serializer is unlocked
  JobWrapper jw = wrapperFactory.createJobWrapper(clone);

  if (jobFacade.containsKey(jw.getKey())) {
    if (!replaceExisting) { throw new ObjectAlreadyExistsException(newJob); }
  } else {
    // get job group
    Set<String> grpSet = toolkitDSHolder.getOrCreateJobsGroupMap(newJob.getKey().getGroup());
    // add to jobs by group
    grpSet.add(jw.getKey().getName());

    if (!jobFacade.hasGroup(jw.getKey().getGroup())) {
      jobFacade.addGroup(jw.getKey().getGroup());
    }
  }

  // add/update jobs FQN map
  jobFacade.put(jw.getKey(), jw);
} finally {
  unlock();
}

}

于 2017-09-18T18:14:51.120 回答