4

我正在为 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);
            }
        }
    }

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

4

1 回答 1

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

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

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

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

于 2012-12-17T20:02:02.643 回答