Подтвердить что ты не робот

Реализуются ли потоки планировщика Quartz потоком?

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

4b9b3361

Ответ 1

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