Безопасны ли экземпляры планировщика Quartz? - PullRequest
12 голосов
/ 26 сентября 2010

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

Ответы [ 2 ]

9 голосов
/ 04 ноября 2010

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

2 голосов
/ 18 марта 2014

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...