【问题标题】:How to save data to JobDataMap during job execution and access it after?如何在作业执行期间将数据保存到 JobDataMap 并在之后访问它?
【发布时间】:2015-11-01 18:49:15
【问题描述】:

我目前正在围绕 Quartz.net 开发某种简化的包装器,以便能够管理所有已注册和在后台运行的作业,显示有关作业执行进度、百分比的附加信息,返回有关当前作业状态的某种消息等。例如,如果我当前的工作是向社交媒体发布数据,我想查看当前发布的数据是哪个社交媒体,或者如果工作是发送电子邮件,我想实时查看 当前生成了多少电子邮件,已经发送了多少,还剩下多少,等等。为此,我在工作Execute 方法中将数据保存到IJobExecutionContext (context.JobDetail.JobDataMap)。然后使用我的经理获取所有当前正在执行的作业:

public List<IJobExecutionContext> RunningJobs
{
     get { return Scheduler.GetCurrentlyExecutingJobs().ToList(); }
}

并显示从JobDataMap 获取的每个IJobExecutionContext 的详细信息。这有点工作正常。但问题是,例如,如果作业执行失败,我想在JobDataMap 中记录(保存)尽可能多的数据,包括异常对象本身。但是,问题是,当作业执行完成时,上下文对象被释放。我丢失了所有这些数据。因此,当我尝试获取当前计划作业的所有 JobDetail 时:

public List<IJobDetail> AllJobs
{
     get
     {
         var result = new List<IJobDetail>();
         var jobGroups = Scheduler.GetJobGroupNames();

         foreach(string group in jobGroups)
         {
            var groupMatcher = GroupMatcher<JobKey>.GroupContains(group);
            var jobKeys = Scheduler.GetJobKeys(groupMatcher);

            foreach(var jobKey in jobKeys)
            {
                var detail = Scheduler.GetJobDetail(jobKey);
                result.Add(detail);
            }
         }

         return result;
     }
}

我看不到我在作业执行期间保存到detail.JobDataMap 的数据。 但是我仍然可以看到在作业初始化/计划时保存的数据,然后才实际执行。作为一个选项,我可以在执行期间捕获异常并记录它(我实际上正在这样做),但我想将此作业标记为失败并在我的作业详细信息视图中显示失败的原因。它使用List&lt;IJobDetail&gt; AllJobs(在上面实现)从我的经理(就像我的工作的某种存储库)那里获取数据。

所以我必须在执行期间使用某种额外的作业详细信息存储来保存这些数据,然后获取所有计划的作业并通过作业 ID 或其他东西映射这些数据。这不是我想要的解决方案。或者实际上有一种方法可以在执行时将数据保存到 JobDataMap 并在执行后访问这些数据?

【问题讨论】:

    标签: c# quartz-scheduler quartz.net


    【解决方案1】:

    经过一些研究,我发现 Quartz 中有两种类型的工作:有状态和无状态(无状态工作)。

    有状态的作业实例遵循与常规作业实例略有不同的规则。关键区别在于,它们关联的 JobDataMap 在每次执行作业后都会重新持久化,从而为下一次执行保留状态。另一个区别是有状态作业不允许并发执行,这意味着在execute(xx)方法完成之前发生的新触发器将被延迟。

    因此,为了实现我的目标,我只需要使用 PersistJobDataAfterExecutionDisallowConcurrentExecution 属性来装饰我的作业类,这将使我的作业有状态,并且在执行后它会保留它的 JobDataMap。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-30
      • 2013-08-08
      • 2020-03-05
      • 2012-09-23
      相关资源
      最近更新 更多