4

私は、特に実行時にジョブの JobDataMap の変更をサポートする Quartz.NET の基本的な Web クライアントに取り組んでいます。

私のジョブは、ジョブをステートフルにするために必要なすべての属性であると私が信じている次の属性で装飾されています。

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

最初は、これは for ジョブを使用していたXMLSchedulingDataProcessorPluginためだと思っていましたが、インメモリ (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 に答える