【发布时间】: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<IJobDetail> AllJobs(在上面实现)从我的经理(就像我的工作的某种存储库)那里获取数据。
所以我必须在执行期间使用某种额外的作业详细信息存储来保存这些数据,然后获取所有计划的作业并通过作业 ID 或其他东西映射这些数据。这不是我想要的解决方案。或者实际上有一种方法可以在执行时将数据保存到 JobDataMap 并在执行后访问这些数据?
【问题讨论】:
标签: c# quartz-scheduler quartz.net