如何从远程客户端持久保存JobDataMap更改

时间:2012-12-17 16:23:26

标签: quartz-scheduler quartz.net

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

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

[PersistJobDataAfterExecution]
[DisallowConcurrentExecution]
public class SampleTenantJob : IJob { ... }

在运行时,我执行以下代码,但不保留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);
            }
        }
    }

我最初认为这是因为我正在使用XMLSchedulingDataProcessorPlugin作业,但我已经尝试了内存(RAMStore)和AdoJobStore,但仍然无法持续JobDataMap更改由远程客户端。

1 个答案:

答案 0 :(得分:4)

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);    
    }
}

没有PersistJobDataAfterExecution属性,count总是相同的。

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

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