我正在为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
更改由远程客户端。
答案 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,并且可以随时从其他地方读取和存储您的工作信息。