代码之家  ›  专栏  ›  技术社区  ›  Ronald Wildenberg

如何使用Quartz调度程序维护作业历史记录

  •  9
  • Ronald Wildenberg  · 技术社区  · 14 年前

    我想维护Quartz计划程序计划的作业历史记录,其中包含以下属性:“开始时间”、“结束时间”、“成功”、“错误”。

    有两个接口可用于此操作: ITriggerListener IJobListener (我使用C语言命名接口,因为我在使用Quartz.NET,但同样的问题可能会被问到Java版本)。

    iJoistListar 有一个 JobToBeExecuted 和A JobWasExecuted 方法。后者提供了 JobExecutionException 这样你就知道什么时候出了问题。然而,没有办法将 乔布斯处决 作业被执行 . 假设我的工作持续十分钟。我开始 t0 t0+2 (所以它们是重叠的)。我接到两个电话 乔布斯处决 在我的历史记录表中插入两个开始时间。当两个作业都在完成时 t1 t1+2 我接到两个电话 作业被执行 . 如何知道每次调用中要更新的数据库记录(用相应的开始时间存储结束时间)?

    iTriggerListener(iTriggerListener) 还有一个问题。无法在 TriggerComplete 方法。

    我怎样才能得到想要的行为?

    3 回复  |  直到 11 年前
        1
  •  12
  •   Ronald Wildenberg    14 年前

    这样做的方法是在 JobToBeExecuted ,存储在 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, ...);
    }
    
        2
  •  4
  •   duffymo    14 年前

    调度程序必须维护一个键,让它关联每个历史记录条目。必须有一个唯一的工作ID,它是在工作开始时创建的,才能实现这一点。

    你没提这件事,所以我觉得值得提一下。

    更新:我会在创建作业时向数据库中插入一条记录,然后返回主键(可能是一个guid)。我会用它作为钥匙。

        3
  •  1
  •   Trevor Pilley    11 年前

    如果您愿意在最后更新数据库,可以从 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);
    }