2010-06-02 8 views
9

का उपयोग करके नौकरी इतिहास को बनाए रखने के लिए कैसे करें मैं निम्न गुणों वाले क्वार्ट्ज शेड्यूलर द्वारा निर्धारित नौकरियों का इतिहास बनाए रखना चाहता हूं: 'प्रारंभ समय', 'अंत समय', 'सफलता', 'त्रुटि '।क्वार्ट्ज शेड्यूलर

इसके लिए दो इंटरफेस उपलब्ध हैं: ITriggerListener और IJobListener (मैं इंटरफेस के लिए सी # नामकरण सम्मेलन का उपयोग कर रहा हूं क्योंकि मैं क्वार्ट्ज.NET का उपयोग कर रहा हूं लेकिन जावा संस्करण के लिए एक ही सवाल पूछा जा सकता है)।

IJobListener में JobToBeExecuted और JobWasExecuted विधि है। उत्तरार्द्ध JobExecutionException प्रदान करता है ताकि आप जान सकें कि कुछ गलत कब हुआ। हालांकि, JobToBeExecuted और JobWasExecuted से संबंधित करने का कोई तरीका नहीं है। मान लीजिए मेरा काम दस मिनट तक चलता है। मैं इसे t0 और t0+2 पर शुरू करता हूं (इसलिए वे ओवरलैप)। मुझे JobToBeExecuted पर दो कॉल मिलती हैं और मेरी इतिहास तालिका में दो प्रारंभिक समय डालें। जब दोनों नौकरियां t1 और t1+2 पर समाप्त होती हैं तो मुझे JobWasExecuted पर दो कॉल मिलते हैं। मुझे कैसे पता चलेगा कि प्रत्येक कॉल में कौन सा डेटाबेस रिकॉर्ड अपडेट करना है (इसके प्रारंभिक समय के साथ अंत समय स्टोर करने के लिए)?

ITriggerListener में एक और समस्या है। नौकरी विफल होने पर TriggerComplete विधि के अंदर कोई त्रुटि प्राप्त करने का कोई तरीका नहीं है।

मैं वांछित व्यवहार कैसे प्राप्त करूं?

उत्तर

12

यह करने के लिए जिस तरह से, JobToBeExecuted में एक पहचानकर्ता उत्पन्न यह JobExecutionContext में स्टोर और JobWasExecuted में JobExecutionContext से इसे फिर से पुनः प्राप्त करने के लिए है।

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

शेड्यूलर को एक कुंजी बनाए रखना है जो इसे प्रत्येक इतिहास प्रविष्टि से सहसंबंधित करने देता है। ऐसी कोई अनोखी नौकरी आईडी होनी चाहिए जो उस समय बनाई गई हो जब नौकरी इसे पूरा करने में सक्षम हो।

आप इस तरह की बात का जिक्र नहीं करते हैं, इसलिए मैंने सोचा कि यह एक सुझाव के लायक था।

अद्यतन: जब कोई नौकरी बनाई जाती है और प्राथमिक कुंजी (शायद एक GUID) वापस प्राप्त होती है तो मैं डेटाबेस में रिकॉर्ड दर्ज करता हूं। मैं उस कुंजी के रूप में उपयोग करता हूँ।

+0

क्या आपको पता है, जहां मैं इस तरह मिल सकता है एक चाबी? –

+0

वर्तमान में कुंजी जॉब समूह, जॉबनाम और दिनांक और समय है। ऐसा लगता है कि 2.0 रिलीज में एक बेहतर कुंजी आ रही है। –

1

तुम सिर्फ अंत में डेटाबेस अद्यतन करने खुश हैं, तो आप कार्य का नाम हो और 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); 
}