Являются ли экземпляры Quartz scheduler потокобезопасными?


Может ли несколько потоков безопасно вызывать методы на экземпляре Scheduler , возвращаемом StdSchedulerFactory одновременно?

2 12

2 ответа:

У меня была эта проблема, поэтому я решил посмотреть исходный код. Предположим, что вы используете стандартную конфигурацию Quartz (хранение заданий и триггеров в оперативной памяти вместо постоянного 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

Этот пост на сайте Terracotta подтверждает это.