Quartz调度程序实例是否安全?

时间:2010-09-26 00:01:44

标签: concurrency thread-safety quartz-scheduler

多个线程可以同时安全地调用Scheduler返回的StdSchedulerFactory实例上的方法吗?

2 个答案:

答案 0 :(得分:9)

我有这个问题,所以我想看看源代码。假设您使用的是Quartz的标准配置(在RAM中存储作业和触发器而不是持久的JobStore),那么Quartz似乎是线程安全的。

深入了解源代码,您将最终访问RamJobStore,它将所有作业和触发器存储在内存中。

public void storeJobAndTrigger(SchedulingContext ctxt, JobDetail newJob,
        Trigger newTrigger) throws JobPersistenceException {
    storeJob(ctxt, newJob, false);
    storeTrigger(ctxt, newTrigger, false);
}

在storeJob(..)和storeTrigger(..)方法的每一个中,都有单独的同步块及其自己的唯一对象,用于以线程安全的方式存储作业和触发器:

synchronized (jobLock) {
        if (!repl) {
            // get job group
            ...
        }
    }

同步触发器:

synchronized (triggerLock) {
       ...

        synchronized (pausedTriggerGroups) {
            ...
        }
    }

简而言之,您似乎可以对Scheduler类的实例进行线程安全调用

答案 1 :(得分:2)

Terracotta网站上的

This post证实了这一点。