在 Quartz.NET 中的作业之间传递信息

Pass information between jobs in Quartz.NET

我有两个 Quartz.NET 工作,偶尔 运行 我需要在它们之间传递信息。我该怎么做?

下面是设置数据的例子class:

[PersistJobDataAfterExecution]
[DisallowConcurrentExecution]
public class PushingJob : IJob
{
    public void Execute(IJobExecutionContext context)
    {
        var keys = context.Scheduler.GetJobKeys(GroupMatcher<JobKey>.AnyGroup());

        foreach (var key in keys)
        {
            var detail = context.Scheduler.GetJobDetail(key);
            if (detail.JobType == typeof(PullingJob))
            {
                detail.JobDataMap.Put("Foo", "Bar");
            }
        }
    }
}

下面是获取数据的示例:

[PersistJobDataAfterExecution]
[DisallowConcurrentExecution]
public class PullingJob : IJob
{
    public void Execute(IJobExecutionContext context)
    {
        Console.WriteLine("Foo property = " + context.MergedJobDataMap.GetString("Foo"));
    }
}

如果您使用的是 DI 引擎,则可以在这两个作业实例之间共享一个实例对象,其中包含一个并发字典。

否则,即使没有 DI 引擎,你也可以在它们之间共享静态并发字典(不太优雅,但它有效):)

例如,注入:

[PersistJobDataAfterExecution]
[DisallowConcurrentExecution]
public class PushingJob : IJob
{
     DataObject _data;

     // with injection
     public PushingJob(DataObject data)
     {
         _data= data;
     }

     public void Execute(IJobExecutionContext context)
     {
        var keys = context.Scheduler.GetJobKeys(GroupMatcher<JobKey>.AnyGroup());

        foreach (var key in keys)
        {
            var detail = context.Scheduler.GetJobDetail(key);
            if (detail.JobType == typeof(PullingJob))
            {
                data.MyDict.AddOrUpdate("Foo", "Bar");
            }
        }
    }
}

[PersistJobDataAfterExecution]
[DisallowConcurrentExecution]
public class PullingJob : IJob
{
     DataObject _data;

     // with injection
     public PushingJob(DataObject data)
     {
         _data= data;
     }

     public void Execute(IJobExecutionContext context)
     {
        Console.WriteLine("Foo property = " + _data.MyDict.GetOrAdd("Foo"));
     }
}