如何持久化来自远程客户端的 JobDataMap 更改

Ben*_*ter 4 quartz-scheduler quartz.net

我正在为 Quartz.NET 开发一个基本的 Web 客户端,它支持在运行时修改作业的 JobDataMap。

我的工作装饰有以下属性,我认为这些属性是使工作有状态所必需的:

[PersistJobDataAfterExecution]
[DisallowConcurrentExecution]
public class SampleTenantJob : IJob { ... }
Run Code Online (Sandbox Code Playgroud)

在运行时,我执行以下代码但 JobDataMap 没有持久化:

    public void UpdateJobProperties(string jobName, string groupName, IDictionary<string, object> properties)
    {
        IJobDetail job;
        if (!TryGetJob(jobName, groupName, out job))
            return;

        foreach (var property in properties)
        {
            if (job.JobDataMap.ContainsKey(property.Key) && property.Value != null)
            {
                job.JobDataMap.Put(property.Key, property.Value);
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

我最初认为这是因为我正在使用XMLSchedulingDataProcessorPluginfor 作业,但我已经尝试了内存(RAMStore)AdoJobStore并且仍然无法保留JobDataMap远程客户端所做的更改。

sgm*_*ore 5

PersistJobDataAfterExecution(顾名思义)仅在作业执行完毕时生效,因此以下作业将跟踪其执行次数

[PersistJobDataAfterExecution]
public class HelloJob : IJob
{
    public void Execute(IJobExecutionContext context)
    {           
        int count = (int?) context.MergedJobDataMap["Count"]    ?? 1;

        Console.WriteLine("hello " + count.ToString() );

        context.JobDetail.JobDataMap.Put("Count" , ++count);    
    }
}
Run Code Online (Sandbox Code Playgroud)

如果没有 PersistJobDataAfterExecution 属性,计数始终相同。

由于您没有运行该作业,因此这对您没有帮助,我认为您必须使用新的 JobDataMap 删除并重新创建该作业。

当然,您不会被迫使用 JobDataMap,并且始终可以从其他地方读取和存储您的工作的信息。