Позволяет нескольким потокам безопасно вызывать методы в экземпляре Scheduler, который возвращается StdSchedulerFactory одновременно?
Реализуются ли потоки планировщика Quartz потоком?
Ответ 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
Ответ 2
Это сообщение на веб-сайте Terracotta подтверждает это.