क्वार्ट्ज के साथ मैंने जो समाधान पाया है, वह ट्रिगर के लिए एक बार अंतराल वापस जाना है और अगले फायरिंग समय की गणना करना है। सभी ट्रिगरों के माध्यम से पुनरावृत्ति करके सबसे हालिया समय जब अतीत में एक ट्रिगर को निकाल दिया जाना चाहिए, तो निर्धारित किया जा सकता है।
प्रत्येक फायरिंग के बीच अंतराल की गणना करें:
Date nextFireTime = trigger.getNextFireTime();
Date subsequentFireTime = trigger.getFireTimeAfter(nextFireTime);
long interval = subsequentFireTime.getTime() - nextFireTime.getTime();
अतीत में अंतराल जब तक कि एक समय के लिए अगले फायरिंग समय खोजें:
Date previousPeriodTime = new Date(System.currentTimeMillis() - interval);
Date previousFireTime = trigger.getFireTimeAfter(previousPeriodTime);
मैं ने पाया है कि यदि आप उपयोग कर रहे हैं एक CronTrigger
यह आपको अतीत में आग का समय बचाने के लिए रोकता है। ट्रिगर के सभी के माध्यम से
Date originalStartTime = trigger.getStartTime(); // save the start time
Date previousPeriodTime = new Date(originalStartTime.getTime() - interval);
trigger.setStartTime(previousPeriodTime);
Date previousFireTime = trigger.getFireTimeAfter(previousPeriodTime);
trigger.setStartTime(originalStartTime); // reset the start time to be nice
दोहराएं और एक है कि सबसे हाल ही में अतीत में मिल: इस हल करने के लिए मैं शुरू करने का समय संशोधित है, इसलिए ऊपर टुकड़ा हो जाता है
for (String groupName : scheduler.getTriggerGroupNames()) {
for (String triggerName : scheduler.getTriggerNames(groupName)) {
Trigger trigger = scheduler.getTrigger(triggerName, groupName);
// code as detailed above...
interval = ...
previousFireTime = ...
}
}
मैं इसे हेलर विधियों या कक्षाओं में पुन: सक्रिय करने के लिए पाठक को एक अभ्यास के रूप में छोड़ देंगे। मैं वास्तव में उप-वर्गीकृत प्रतिनिधि ट्रिगर में उपर्युक्त एल्गोरिदम का उपयोग करता हूं जिसे मैं पिछले फायरिंग समय द्वारा क्रमबद्ध सेट में रखता हूं।https://github.com/devbhuwan/cron-micro-utils
हाय स्टीफन, आपकी प्रतिक्रिया के लिए धन्यवाद। मैंने अपनी समस्या को दूर करने के लिए अपने प्रश्न के नोट्स में थोड़ी अधिक जानकारी जोड़ दी है। –