Quartz.net 2.6.2 - Изменения JobDataMap не сохраняются при срабатывании триггера - PullRequest
0 голосов
/ 26 сентября 2019

Я создал планировщик, который использует постоянное хранилище 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);

Однако я нахожу это количество объектов, возвращаемых в коллекцию состояний (до того, как я добавлю) всегда равен нулю, независимо от того, сколько раз выполняется задание.

...