![](/img/trans.png)
[英]How I can Schedule Job in Quartz using Task<IScheduler> scheduler
[英]How to maintain a job history using Quartz scheduler
我想保留由Quartz调度程序安排的作业历史,其中包含以下属性:“开始时间”,“结束时间”,“成功”,“错误”。
有两个可用的接口: ITriggerListener
和IJobListener
(我正在使用接口的C#命名约定,因为我使用的是Quartz.NET,但可能会要求Java版本提出相同的问题)。
IJobListener
有一个JobToBeExecuted
和一个JobWasExecuted
方法。 后者提供了一个JobExecutionException
以便您知道什么时候出错了。 但是,无法关联JobToBeExecuted
和JobWasExecuted
。 假设我的工作运行了十分钟。 我在t0
和t0+2
开始它(所以它们重叠)。 我得到两次对JobToBeExecuted
调用,并在我的历史表中插入两个开始时间。 当两个作业都在t1
和t1+2
结束时,我得到两次对JobWasExecuted
调用。 我如何知道每次调用中要更新的数据库记录(存储结束时间及其相应的开始时间)?
ITriggerListener
还有另一个问题。 作业失败时,无法在TriggerComplete
方法中获取任何错误。
我如何获得所需的行为?
要做到这一点的方法是产生一个标识符JobToBeExecuted
,其存储在JobExecutionContext
从再次检索它JobExecutionContext
在JobWasExecuted
。
public void JobToBeExecuted(JobExecutionContext context)
{
// Insert history record and retrieve primary key of inserted record.
long historyId = InsertHistoryRecord(...);
context.Put("HistoryIdKey", historyId);
}
public void JobWasExecuted(JobExecutionContext context,
JobExecutionException jobException)
{
// Retrieve history id from context and update history record.
long historyId = (long) context.Get("HistoryIdKey");
UpdateHistoryRecord(historyId, ...);
}
调度程序必须维护一个密钥,使其关联每个历史记录条目。 必须有一个独特的工作ID,当工作开始时能够实现这一点。
你没有提到这样的事情,所以我认为值得一个建议。
更新:我在创建作业时将记录插入数据库并返回主键(可能是GUID)。 我会用它作为关键。
如果您很乐意在最后更新数据库,则可以从IJobExecutionContext
获取作业名称和运行时间:
public void JobWasExecuted(JobExecutionContext context,
JobExecutionException jobException)
{
var sql = @"INSERT INTO MyJobAuditHistory
(JobKey, RunTime, Status, Exception) VALUES (?, ?, ?, ?)";
// create command etc.
command.Parameters.Add(context.JobDetail.Key.ToString());
command.Parameters.Add(context.JobRunTime);
command.Parameters.Add(jobException == null ? "Success" : "Fail");
command.Parameters.Add(jobException == null ? null : jobException.Message);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.