我正在编写一个 API,它接收关于何时何地发出 GET 请求的请求,然后将使用 Quartz 安排适当的时间来发出这些请求。目前,每次发出请求时,我都会调用 getDefaultScheduler,以便安排适当的作业和触发器。我现在将作业存储在内存中,但计划稍后使用 JDBC 存储作业。
这种方法安全吗?我们可以假设应用程序可能有许多并发请求,并且应用程序将确保不会有任何触发器和作业名称冲突。
我正在编写一个 API,它接收关于何时何地发出 GET 请求的请求,然后将使用 Quartz 安排适当的时间来发出这些请求。目前,每次发出请求时,我都会调用 getDefaultScheduler,以便安排适当的作业和触发器。我现在将作业存储在内存中,但计划稍后使用 JDBC 存储作业。
这种方法安全吗?我们可以假设应用程序可能有许多并发请求,并且应用程序将确保不会有任何触发器和作业名称冲突。
是的,它们是线程安全的。但请继续查看您正在使用的 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();
}
}