Я создал планировщик, который использует постоянное хранилище SQL Server, а не хранилище в памяти.
Затем я создаю задание, с которым связан JobDataMap.
Затем я создаю2 различных триггера и передают задание и коллекцию триггеров в планировщик для выполнения.
Когда запускается первый экземпляр задания, я извлекаю карту данных задания и изменяю один из элементов в ожидании, что когда 2-йэкземпляр задания запускается ... он может прочитать измененный элемент.Однако, когда запускается 2-й экземпляр, элемент по-прежнему имеет исходное значение.
Я проверил это с использованием оперативной памяти в поставщике памяти ... и он работает, как и ожидалось.Однако, когда я использую провайдера SQL-сервера, это не так.Затем я проверил, добавив следующие атрибуты в мой класс Job ... но это никак не повлияло:
[Quartz.PersistJobDataAfterExecutionAttribute ()] [Quartz.DisallowConcurrentExecutionAttribute ()]
У меня естьодин пример задания запланирован против 2 триггеров.моя работа и связанный с ней пример карты данных о работе приведены ниже.
List<DateTime> state = new List<DateTime>();
var jobDataMap = new Dictionary<string, object>
{
{ "job.bookmark", "some stuff" },
{ "job.mydate", System.DateTime.Now },
{ "myStateData", state },
{ "job.subscriberId", "more stuff" },
{ "job.machineName", "crazy stuff" }
};
IJobDetail job = JobBuilder.Create<Job>()
.RequestRecovery(true)
//.SetJobData(new JobDataMap(jobDataMap as IDictionary<string, object>))
.UsingJobData(new JobDataMap(jobDataMap as IDictionary<string, object>))
.WithIdentity("myJob", "group1") /
.Build();
ITrigger trigger = TriggerBuilder.Create()
.WithIdentity("IDGJob", "IDG
.StartAt(date)
.WithPriority(1)
.Build();
ITrigger trigger2 = TriggerBuilder.Create()
.WithIdentity("IDGJob2", "IDG")
.StartAt(date.AddMinutes(1))
.WithPriority(1)
.Build();
Quartz.Collection.HashSet<ITrigger> listTriggers = new Quartz.Collection.HashSet<ITrigger>();
listTriggers.Add(trigger);
listTriggers.Add(trigger2);
scheduler.ScheduleJob(job, listTriggers,true);
Когда задание запускается, я извлекаю значение myStateData, используя приведенный ниже код, и обновляю его.Идея состоит в том, чтобы извлекать пустую коллекцию, а затем добавлять новый элемент при каждом запуске задания.
List<DateTime> state = (List<DateTime>)context.JobDetail.JobDataMap["myStateData"];
state.Add(System.DateTime.UtcNow);
Однако я нахожу это количество объектов, возвращаемых в коллекцию состояний (до того, как я добавлю) всегда равен нулю, независимо от того, сколько раз выполняется задание.