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

Mat*_*att 12 concurrency thread-safety quartz-scheduler

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

Ric*_*ard 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);
}
Run Code Online (Sandbox Code Playgroud)

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

synchronized (jobLock) {
        if (!repl) {
            // get job group
            ...
        }
    }
Run Code Online (Sandbox Code Playgroud)

并同步触发器:

synchronized (triggerLock) {
       ...

        synchronized (pausedTriggerGroups) {
            ...
        }
    }
Run Code Online (Sandbox Code Playgroud)

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