Являются ли экземпляры Quartz scheduler потокобезопасными?
Может ли несколько потоков безопасно вызывать методы на экземпляре Scheduler , возвращаемом StdSchedulerFactory одновременно?
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 подтверждает это.