.net Quartz计划程序在多线程服务中不工作
我有一段代码,它将使用石英创造就业机会。此代码将由多个线程调用.net Quartz计划程序在多线程服务中不工作,.net,multithreading,multiprocessing,quartz-scheduler,quartz.net,.net,Multithreading,Multiprocessing,Quartz Scheduler,Quartz.net,我有一段代码,它将使用石英创造就业机会。此代码将由多个线程调用 ISchedulerFactory fac = new StdSchedulerFactory(); sched = fac.GetScheduler(); // schedele job sched.ScheduleJob(job1, trigger1); sched.Shutdown(); 有时,我在获取计划程序时会收到错误消息 名为“{0}”的计划程
ISchedulerFactory fac = new StdSchedulerFactory();
sched = fac.GetScheduler();
// schedele job
sched.ScheduleJob(job1, trigger1);
sched.Shutdown();
有时,我在获取计划程序时会收到错误消息
名为“{0}”的计划程序已存在
如果我将getscheduler逻辑移到singleton类中,正如pere在某个论坛上建议的那样,它运行良好,没有任何问题。我不知道为什么我们需要把它转移到一个单身班
我真的不明白是什么导致了这个问题
此代码将由多个线程调用
ISchedulerFactory fac = new StdSchedulerFactory();
sched = fac.GetScheduler();
// schedele job
sched.ScheduleJob(job1, trigger1);
sched.Shutdown();
这样,在实例化调度程序实例时,调用线程之间可能会出现争用条件。
应该防止创建具有相同名称的调度程序,这是合乎逻辑的。quartz中创建调度程序实例的代码可能不是线程安全的。:-) 您是否使用jmx或rmi代理远程调度器?我使用的是.Net版本的Quartzcan,请您解释一下。为什么不建议使用相同名称的多个调度程序。我在想,一旦工作完成,如果允许每个线程使用相同名称的shecduler,我就可以在那一刻关闭调度程序本身。对于singleton,我无法关闭调度程序,我必须保留调度程序,直到整个系统完全卸载。调度程序名称可能是调度程序实例的主键,这就是为什么不能创建具有相同名称的多个实例。您的并发线程正在尝试同时实例化调度程序。因此,竞争条件正在发生。您可能希望获得已创建的调度程序实例,并将其分发到并发线程。但不幸的是,这是不可能的,因为getScheduler()是石英代码。