Планировщик Quartz.net не запускает задания / триггеры после развертывания
м используюQuartz.Net наASP.Net Framework 4, веб-сайт веб-форм. По сути, пользователь должен иметь возможность вручную запускать пакетный скрипт, который асинхронно обрабатывает тысячи записей, хранящихся в базе данных. Пользователь может в любой момент остановиться или сделать паузу, настроить некоторые переменные и, если необходимо, продолжить процесс (оставшиеся записи).
Код готов и работает локально (разработчик, win7, vs2010, sql server express 2008 R2).
Он также был протестирован на локальном сервере (Win Server 2008 R2, SQL Server Express 2008 R2). Он отлично работает в обеих средах, протестирован с предварительно скомпилированным кодом. Проблема в том, что,после развертывания на удаленном сервере (win server 2008 R2), где он на самом деле должен работать (среда размещения, не разделяемая, не кластеризованная), он не работает полностью (подробности см. ниже).Планировщик создается, но триггер, следовательно, задание, нет огонь. (
Замечания: Я знаю, что некоторые из вас предложили бы использовать Quartz в качестве службы Windows, но, несмотря на преимущества этого, я действительно хотел бы выяснить, почему это не так.t работает как встроенное решение, так как оно должно работать нормально, как и локально)
ПОДРОБНОСТИQuartz 2.1.2
Common.Logging 2.1.2
Common.Logging.NLog 2.0.0
NLog 2.0.1.2
global.asax
public static ISchedulerFactory SchedulerFactory;
public static IScheduler Scheduler;
void Application_Start(object sender, EventArgs e)
{
SchedulerFactory = new StdSchedulerFactory();
Scheduler = SchedulerFactory.GetScheduler();
// Define a durable job instance (durable jobs can exist without triggers)
IJobDetail job = JobBuilder.Create()
.WithIdentity("MyJob", "MyGroup")
.StoreDurably()
.Build();
Scheduler.AddJob(job, false);
Scheduler.Start();
}
void Application_End(object sender, EventArgs e)
{
Scheduler.Shutdown(true);
}
process.aspx.cs (нажмите кнопку запуска)
// get records from DB, iterate, process, etc
...
IJobDetail job = ASP.global_asax.Scheduler.GetJobDetail(new JobKey("MyJob", "MyGroup"));
job.JobDataMap.Put("something1", 1);
job.JobDataMap.Put("something2", somevar);
ITrigger trigger = TriggerBuilder.Create()
.WithIdentity("MyTrigger", "MyGroup")
.StartNow()
.WithSimpleSchedule(x => x.WithIntervalInSeconds(5).RepeatForever())
.Build();
var triggersSet = new Quartz.Collection.HashSet { trigger };
ASP.global_asax.Scheduler.ScheduleJob(job, triggersSet, true);
LOG OUTPUTлокальный журналDefault Quartz.NET properties loaded from embedded resource file
Using default implementation for object serializer
Using default implementation for ThreadExecutor
Initialized Scheduler Signaller of type: Quartz.Core.SchedulerSignalerImpl
Quartz Scheduler v.2.1.2.400 created.
RAMJobStore initialized.
Scheduler meta-data: Quartz Scheduler (v2.1.2.400) 'DefaultQuartzScheduler' with instanceId 'NON_CLUSTERED' Scheduler class: 'Quartz.Core.QuartzScheduler' - running locally. NOT STARTED. Currently in standby mode. Number of jobs executed: 0 Using thread pool 'Quartz.Simpl.SimpleThreadPool' - with 10 threads. Using job-store 'Quartz.Simpl.RAMJobStore' - which does not support persistence. and is not clustered.
Quartz scheduler 'DefaultQuartzScheduler' initialized
Quartz scheduler version: 2.1.2.400
Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED started.
Batch acquisition of 0 triggers
Batch acquisition of 0 triggers
Продолжается регистрацияПакетное приобретение 0 триггеров до нажатия кнопки:
Default Quartz.NET properties loaded from embedded resource file
Batch acquisition of 1 triggers
Producing instance of Job 'MyGroup.MyJob', class=MyJobClass
Batch acquisition of 0 triggers
Calling Execute on job MyGroup.MyJob
Trigger instruction : NoInstruction
Batch acquisition of 1 triggers
Producing instance of Job 'MyGroup.MyJob', class=MyJobClass
Batch acquisition of 0 triggers
Calling Execute on job MyGroup.MyJob
Trigger instruction : NoInstruction
Batch acquisition of 1 triggers
развернутый журналDefault Quartz.NET properties loaded from embedded resource file
Using default implementation for object serializer
Using default implementation for ThreadExecutor
Initialized Scheduler Signaller of type: Quartz.Core.SchedulerSignalerImpl
Quartz Scheduler v.2.1.2.400 created.
RAMJobStore initialized.
Scheduler meta-data: Quartz Scheduler (v2.1.2.400) 'DefaultQuartzScheduler' with instanceId 'NON_CLUSTERED' Scheduler class: 'Quartz.Core.QuartzScheduler' - running locally. NOT STARTED. Currently in standby mode. Number of jobs executed: 0 Using thread pool 'Quartz.Simpl.SimpleThreadPool' - with 10 threads. Using job-store 'Quartz.Simpl.RAMJobStore' - which does not support persistence. and is not clustered.
Quartz scheduler 'DefaultQuartzScheduler' initialized
Quartz scheduler version: 2.1.2.400
Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED started.
Вот так и остается. Как видите, по сравнению с другим журналомне пытается получить триггеры (линияПакетное приобретение 0 триггеров не появляется вообще). Если вы все равно нажмете кнопку процесса, журнал добавит одну строку:
Default Quartz.NET properties loaded from embedded resource file
Но больше ничего не происходит. Записи не обрабатываются (я знаю, так как каждый раз, когда запись обрабатывается, отмечается в базе данных). Ошибки не возникают, нотриггер не срабатывает, и задание не выполняется. Кроме того, загрузка процессора до 50% и более при нажатии кнопки не снижается, если вы не перейдете в IIS, не остановите и не перезапустите пул приложений., Это потребление процессора не делаетэто происходит на местном уровне.
обновление 1Изменено использование планировщика дляодиночкав соответствии с предложением LeftyX, но на удаленном сервере все так же.
обновление 2Я также пытался использоватьADOJobStore (вместоRAMJobStore который я использовал). Теперь он все еще отлично работает на местном уровне; нодо сих пор неt выполнить триггер (следовательно, работу) онлайн, Разница лишь в том, что в режиме онлайн загрузка процессора нене работает до 50%. И теперь я вижу, чтозадание и триггер созданы (Я запрашиваю таблицы и вижу, что эти записи существуют),но никогда не будет казнен.