2009-03-05 19 views
7

मेरे प्रोग्राम में एक घटक है - शेड्यूलर डब किया गया है - जो अन्य घटकों को उन बिंदुओं पर रजिस्टर करने देता है, जिन पर वे वापस कॉल करना चाहते हैं। यह यूनिक्स क्रॉन सेवा की तरह काम करना चाहिए, i। ई। आप शेड्यूलर को बताते हैं "मुझे हर पूर्ण घंटे में दस मिनट में सूचित करें"।जावा लाइब्रेरी क्लास "कॉलबैक" के निर्धारित निष्पादन को संभालने के लिए?

मुझे एहसास है कि जावा में कोई वास्तविक कॉलबैक नहीं है।

यहां मेरा दृष्टिकोण है, क्या कोई पुस्तकालय है जो पहले से ही यह सामान करता है? सुधार भी सुझाव देने के लिए स्वतंत्र महसूस करें। समयबद्धक को

रजिस्टर कॉल गुजरता है:

  • युक्त घंटा, मिनट, दूसरा, साल महीने, डोम, डो, जहां प्रत्येक आइटम अनिर्दिष्ट हो सकता है एक समय विनिर्देश, जिसका अर्थ है 'आदि यह हर घंटे/मिनट पर अमल " (जैसे crontabs की तरह)
  • डेटा युक्त एक ऑब्जेक्ट जो कॉलिंग ऑब्जेक्ट को बताएगा कि शेड्यूलर द्वारा अधिसूचित किए जाने पर क्या करना है। शेड्यूलर इस डेटा को संसाधित नहीं करता है, बस इसे स्टोर करता है और उसे अधिसूचना पर वापस भेज देता है।
  • बुला वस्तु

स्टार्टअप पर के लिए एक संदर्भ, या एक नया पंजीकरण अनुरोध के बाद, समयबद्धक मौजूदा सिस्टम का समय और चेकों के एक कैलेंडर वस्तु के साथ शुरू होता है, तो वहाँ डेटाबेस में कोई भी प्रविष्टि है कि इस मेल खाते हैं कोई निश्चित समय। यदि वहां हैं, तो उन्हें निष्पादित किया जाता है और प्रक्रिया शुरू हो जाती है। यदि नहीं हैं, तो कैलेंडर ऑब्जेक्ट में समय एक सेकंड से बढ़ता है और एंटरिस को फिर से जांच लिया जाता है। यह तब तक दोहराता है जब तक एक प्रविष्टि या अधिक मिलान नहीं होता है (एस)। (असतत इवेंट सिमुलेशन)

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


संपादित: मुझे क्वार्ट्ज की ओर इशारा करते के लिए धन्यवाद। हालांकि, मैं कुछ बहुत छोटा खोज रहा हूं।

उत्तर

4

के रूप में जावा ScheduledExecutorService उपयोग कर सकते हैं अपनी आवश्यकताओं सरल कर रहे हैं, java.util.Timer उपयोग करने पर विचार:, ExecutorService

public class TimerDemo { 

    public static void main(String[] args) { 
    // non-daemon threads prevent termination of VM 
    final boolean isDaemon = false; 
    Timer timer = new Timer(isDaemon); 

    final long threeSeconds = 3 * 1000; 
    final long delay = 0; 
    timer.schedule(new HelloTask(), delay, threeSeconds); 

    Calendar calendar = Calendar.getInstance(); 
    calendar.add(Calendar.MINUTE, 1); 
    Date oneMinuteFromNow = calendar.getTime(); 

    timer.schedule(new KillTask(timer), oneMinuteFromNow); 
    } 

    static class HelloTask extends TimerTask { 
    @Override 
    public void run() { 
     System.out.println("Hello"); 
    } 
    } 

    static class KillTask extends TimerTask { 

    private final Timer timer; 

    public KillTask(Timer timer) { 
     this.timer = timer; 
    } 

    @Override 
    public void run() { 
     System.out.println("Cancelling timer"); 
     timer.cancel(); 
    } 
    } 

} 

रूप noted कर दिया गया है java.util.concurrent यदि आपको इसकी आवश्यकता हो तो एक समृद्ध एपीआई प्रदान करता है।

4

Quartz इस क्षेत्र में बड़ा और स्पष्ट पावरहाउस है, लेकिन कुछ विकल्प तलाशने के लिए हैं।

Cron4j एक सभ्य पर्याप्त पुस्तकालय है, जो क्वार्ट्ज की तुलना में थोड़ा हल्का है। यह अच्छा प्रलेखन प्रदान करता है और जो भी आप चाहते हैं वह करेगा।

शायद और अधिक दिलचस्प आप एक पुस्तकालय है कि जावा के संगामिति पुस्तकालयों (विशेष रूप से निष्पादकों और ScheduledExecutors) के साथ बेहतर फिट बैठता है तो HA-JDBC एक CronExecutorService इंटरफेस, इसकी CronThreadPoolExecutor द्वारा कार्यान्वित है उपयोग करने के लिए चाहते हैं। अब, दिलचस्प बात यह है कि क्वार्ट्ज (क्रोनएक्सप्रेस वर्ग प्रदान करने के लिए) पर निर्भरता है, लेकिन मुझे लगता है कि दोनों एक साथ क्वार्ट्ज की तुलना में बेहतर काम करते हैं। यदि आप बड़ी निर्भरता नहीं चाहते हैं, तो क्वार्ट्ज और एचए-जेडीबीसी से कक्षाओं के मुट्ठी भर निकालना आसान है जो ऐसा होता है।

चूंकि आप कुछ बहुत छोटा चाहते हैं (केवल आपका संपादन देखा है), क्वार्ट्ज से क्रोनएक्सप्रेस, और ऊपर वर्णित दो एचए-जेडीबीसी कक्षाओं को पकड़ो। वह ऐसा करेगा।

5

यदि आपकी ऑब्जेक्ट्स उस समय में अलग-अलग बिंदुओं को जानती हैं जिन्हें वे निष्पादित करना चाहते हैं, तो आप java.util.concurrent.ScheduledExecutorService का उपयोग कर सकते हैं। तब वे सरल कॉल:

ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(2); 
long timeToExecute = ... //read from DB? use CronTrigger? 
long delayToExecution = timeToExecute - System.currentTimeMillis(); 
scheduler.schedule(aRunnable, delayToExecution, TimeUnit.MILLISECONDS); 

आप केवल Quartz उपयोग करने के लिए आप अनुसूचक ही "हर 5 सेकंड पर अमल" की तरह कार्यक्षमता को संभालने के लिए चाहते हैं, तो जरूरत है या चाहते हैं आप जटिल व्यवहार याद आसपास फांसी, या हठ करना चाहते हैं निष्पादन लेखा परीक्षा निशान का।

आप वास्तव में "अगले निष्पादन समय" प्राप्त करने के लिए क्वार्ट्ज की CronTrigger कक्षा का पुन: उपयोग कर सकते हैं। कक्षा पूरी तरह से स्टैंडअलोन है और Quartz "संदर्भ" के भीतर से आने पर निर्भर नहीं है। एक बार जब आप एक Date या long के रूप में अगले निष्पादन समय है, तो आप बस ऊपर

0

java.util पर विश्वास नहीं कर सकता। टिमर को उत्तर के रूप में वोट दिया गया था। क्वार्ट्ज वास्तव में एक बेहतर विकल्प है।

जावा.टिल पर क्वार्ट्ज का एक बड़ा फायदा। टिमर यह है कि क्वार्ट्ज के साथ नौकरियों को डीबी में संग्रहीत किया जा सकता है। नतीजतन एक जेवीएम शेड्यूल कर सकता है और दूसरा निष्पादित कर सकता है। इसके अलावा (जाहिर है) अनुरोध jvm restarts में जीवित रहता है।

+0

हाँ, लेकिन मुझे अतिरिक्त निर्भरताओं के बिना कुछ वास्तव में सरल की आवश्यकता थी। मुझे वैसे भी मेरे ऐप में दृढ़ता से संभाला गया है, शेड्यूलर को इसकी आवश्यकता नहीं है। मुझे अपनी सूची में क्वार्ट्ज मिला है, हालांकि मुझे बाद में और अधिक शक्ति की आवश्यकता होनी चाहिए। –

+0

सबसे हालिया रिलीज में, अब आप डेटाबेस के अलावा टेराकोटा के साथ क्वार्ट्ज नौकरियां क्लस्टर कर सकते हैं। –

+1

यह मजाकिया है कि क्वार्ट्ज दृढ़ता सुविधाओं को एक बड़े लाभ के रूप में बताया जाता है: कई/ज्यादातर मामलों में वे केवल एक बड़ी पिटा हैं। – StaxMan

0

शायद और अधिक दिलचस्प आप एक पुस्तकालय है कि जावा के संगामिति पुस्तकालयों (विशेष रूप से निष्पादकों और ScheduledExecutors) तो HA-JDBC एक CronExecutorService इंटरफ़ेस है, इसकी CronThreadPoolExecutor द्वारा कार्यान्वित के साथ बेहतर फिट बैठता उपयोग करना चाहते हैं है। अब, दिलचस्प बात यह है कि क्वार्ट्ज (क्रोनएक्सप्रेस वर्ग प्रदान करने के लिए) पर निर्भरता है, लेकिन मुझे लगता है कि दोनों एक साथ क्वार्ट्ज की तुलना में बेहतर काम करते हैं। यदि आप बड़ी निर्भरता नहीं चाहते हैं, तो क्वार्ट्ज और एचए-जेडीबीसी से कक्षाओं के मुट्ठी भर निकालना आसान है जो ऐसा होता है।

मैं बस इतना कहना चाहता था कि मैंने इन वर्गों को निकालने का प्रयास किया, और यह काम किया! मैं इन तीन वर्गों की जरूरत:

  • CronExpression (क्वार्ट्ज)
  • CronThreadPoolExecutor (हा JDBC)
  • DaemonThreadFactory (हा JDBC)

और मैं केवल इन नाबालिग तोड़ मरोड़ करना था:

  • CronThreadPoolExecutor से लकड़हारा निकाला जा रहा है (यह बनाया गया था लेकिन इस्तेमाल कभी नहीं)
  • ले जाया गया CronTrigger से लगातार YEAR_TO_GIVEUP_SCHEDULING_AT

CronExpression लिए मैं रोमांचित था कि मैं निर्भरता की एक उलझन में फंस पुल नहीं मिला। कक्षा लेखकों को बधाई!

और यह एक चैंप की तरह काम कर रहा है।

1

मैं क्वार्ट्ज पर cron4j (पहले से ही उल्लेख किया गया) की दृढ़ता से अनुशंसा करता हूं, जब तक कि आपको क्वार्ट्ज की कुछ और उन्नत और जटिल विशेषताओं की आवश्यकता न हो। Cron4j अच्छी तरह से ध्यान केंद्रित करता है कि इसे क्या करना है, सभ्य दस्तावेज है, और यह रसोई-सिंक समाधान नहीं है।