2010-06-02 31 views
9

Tôi muốn duy trì lịch sử công việc đã được lên lịch bởi một bộ lập lịch thạch anh có các thuộc tính sau: 'thời gian bắt đầu', 'thời gian kết thúc', 'thành công', 'lỗi '.Cách duy trì lịch sử công việc bằng cách sử dụng Lịch hẹn Quartz

Có hai giao diện cho điều này: ITriggerListenerIJobListener (Tôi đang sử dụng quy ước đặt tên C# cho giao diện vì tôi đang sử dụng Quartz.NET nhưng cùng một câu hỏi có thể được yêu cầu cho phiên bản Java).

IJobListenerJobToBeExecuted và phương thức JobWasExecuted. Sau này cung cấp một số JobExecutionException để bạn biết khi nào có sự cố. Tuy nhiên, không có cách nào để tương quan JobToBeExecutedJobWasExecuted. Giả sử công việc của tôi chạy trong mười phút. Tôi bắt đầu nó tại t0t0+2 (để chúng chồng lên nhau). Tôi nhận được hai cuộc gọi đến JobToBeExecuted và chèn hai lần bắt đầu vào bảng lịch sử của tôi. Khi cả hai công việc đều kết thúc tại t1t1+2 Tôi nhận được hai cuộc gọi đến JobWasExecuted. Làm cách nào để biết bản ghi cơ sở dữ liệu nào cập nhật trong mỗi cuộc gọi (để lưu trữ thời gian kết thúc với thời gian bắt đầu tương ứng)?

ITriggerListener có vấn đề khác. Không có cách nào để nhận được bất kỳ lỗi nào trong phương thức TriggerComplete khi công việc thất bại.

Làm cách nào để có được hành vi mong muốn?

Trả lời

12

Cách thực hiện việc này là tạo mã định danh trong JobToBeExecuted, lưu trữ số này trong số JobExecutionContext và truy xuất lại từ JobExecutionContext trong 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, ...); 
} 
4

Trình lên lịch phải duy trì một khóa cho phép nó tương quan với mỗi mục nhập lịch sử. Phải có một ID công việc duy nhất của một số loại được tạo khi công việc bắt đầu để có thể thực hiện việc này.

Bạn không đề cập đến một điều như vậy, vì vậy tôi nghĩ rằng đó là giá trị một đề nghị.

CẬP NHẬT: Tôi sẽ INSERT một bản ghi vào cơ sở dữ liệu khi công việc được tạo và lấy lại khóa chính (có thể là GUID). Tôi sẽ dùng nó làm chìa khóa.

+0

Bạn có bất cứ ý tưởng nơi tôi có thể tìm thấy như vậy một chìa khóa? –

+0

Hiện tại khóa là JobGroup, JobName và ngày và giờ. Có vẻ như một chìa khóa tốt hơn đang đến trong bản phát hành 2.0. –

1

Nếu bạn hài lòng chỉ cần cập nhật cơ sở dữ liệu ở cuối, bạn có thể lấy tên công việc và thời gian chạy từ 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); 
} 
Các vấn đề liên quan