0

У меня есть кусок кода, который будет создавать задания с использованием Quartz. Этот код будет вызываться несколько потокамиQuartz Scheduler не работает в многопоточном сервисе

ISchedulerFactory fac = new StdSchedulerFactory(); 
       sched = fac.GetScheduler(); 

// schedele job 

    sched.ScheduleJob(job1, trigger1); 
       sched.Shutdown(); 

несколько раз я Geting сообщения об ошибке при получении планировщика

планировщик с именем «{0}» уже существует.

Как и в случае с некоторым форумом adveton Если я перехожу к логике пересылки в одиночный класс, он отлично работает без каких-либо проблем. Я не уверен, почему нам нужно переместить его в одноэлементный класс.

Я действительно не понимаю, что вызывает проблему.

+0

Вы проксимируете удаленный планировщик с помощью jmx или rmi? – Shinchan

+0

Я использую .Net версию Quartz – Brainchild

ответ

0

Этот код будет вызываться несколькими потоками

С этим, подразумевается, что условия гонки может происходить между вызовом нити во время инстанцирования экземпляра планировщика. И логично, что создание планировщика с тем же именем должно быть предотвращено. Вероятно, код в кварце, который создает экземпляр планировщика, не является потокобезопасным. :-)

+0

не могли бы вы объяснить. почему не желательно иметь несколько планировщиков с тем же именем. Я думаю, что если каждому потоку разрешено иметь shecduler с тем же именем после завершения работы, я могу закрыть планировщик в тот момент сам. с singleton, я не могу отключить планировщик, я должен обработать планировщик, пока вся система не будет полностью разгружена. – Brainchild

+0

Имя планировщика может быть основным ключом для экземпляра планировщика, поэтому вы не можете создать несколько экземпляров с тем же именем. Ваши одновременные потоки пытаются создать экземпляр планировщика одновременно. Таким образом, состояние гонки происходит. Каково ваше желание, чтобы получить экземпляр планировщика, который уже создан, и распространить его на ваши однотонные потоки . Но, к сожалению, это невозможно, поскольку getScheduler() - это кварцевый код. – Shinchan

Смежные вопросы