2013-07-29 5 views
5

मैं नई बनाई गई फ़ाइलों पर निर्देशिका और अग्नि तर्क की निगरानी करने के लिए एक घड़ी सेवा का उपयोग कर रहा हूं। हाल ही में जिन चुनौतियों का मैंने अनुभव किया है उनमें से एक एक ओवरफ्लो ट्रिगर किया जा रहा है जब फ़ाइलों की एक बड़ी मात्रा को संसाधित करने की आवश्यकता होती है और घड़ी निर्देशिका में कॉपी करने के लिए बहुत तेज़ी से कॉपी किया जाता है।मैं watchservice में pollEvents() ओवरफ्लो प्रकार को सही तरीके से कैसे संभाल सकता हूं?

फाइल सिस्टम तेजी से वे या प्राप्त किए जा सकें संसाधित घटनाओं की सूचना दे सकते हैं और एक कार्यान्वयन की घटनाओं है कि यह जमा कर सकते हैं की संख्या पर एक अनिर्दिष्ट सीमा लागू हो सकता है:

API इस बारे में अतिप्रवाह कहते हैं। जहां एक कार्यान्वयन जानबूझकर घटनाओं को त्याग देता है तो यह किसी घटना प्रकार के ओवरव्लो के साथ तत्व को वापस करने के लिए कुंजी के पोलवेन्ट्स विधि की व्यवस्था करता है।

मेरा सवाल यह है कि, मैं संसाधित होने की आवश्यकता वाले किसी भी कार्यक्रम को खोए बिना ओवरफ्लो को सही ढंग से कैसे संभाल सकता हूं?

मेरे watchservice कोड लगता है:

  Path myDir = Paths.get(srcDir); 
      try(WatchService watcher = myDir.getFileSystem().newWatchService()){ 
       myDir.register(watcher, ENTRY_CREATE,ENTRY_MODIFY); 
       int x = 0; 
       for(;;){ 
        x++; 
        WatchKey watchKey = watcher.take(); 
        LOGGER.debug("Event # {}",x); 
        List<WatchEvent<?>> events = watchKey.pollEvents(); 
        LOGGER.info("Events Size {}",events.size()); 
        for (WatchEvent event : events) { 
         if(event.kind() == OVERFLOW){ 
          LOGGER.error("The Maximum watchService events has been reached!"); 
          System.exit(1); //I exit so I know there is a problem - but how should I handle this? 
         } 
         if (event.kind() == ENTRY_CREATE) { 
          LOGGER.info("File created: " + event.context().toString()); 
          LOGGER.info("Beginning Processing:" +event.context().toString()); 
          ...business logic here... 
         } 
        } 
        watchKey.reset(); 
       } 
      ... 
+1

एक अतिप्रवाह * मतलब * आपने ईवेंट खो दिए हैं। यह कहना समझ में नहीं आता है कि आप एक ओवरफ्लो को संभालना चाहते हैं और घटनाओं को खोना नहीं चाहते हैं। –

+0

@ पीटर Lawrey दस्तावेज यह भी बताता है कि इस घटना का उपयोग उपभोक्ता द्वारा ऑब्जेक्ट की स्थिति की पुन: जांच करने के लिए ट्रिगर के रूप में किया जा सकता है। 'अगर मैं ओवरफ्लो के कारण कोई ईवेंट खो देता हूं, तो मेरी अगली घटनाएं अभी भी कतार करें? और यदि हां, तो मैं घटनाओं का अगला सेट कैसे प्राप्त करूं? –

उत्तर

2

मैं व्यवहार में अतिप्रवाह घटना कभी नहीं देखा। इसका मतलब आपको सूचित करना था कि आपको जो भी निर्देशिका दिखाई दे रही है उसे पुन: प्रसंस्करण करने की आवश्यकता होगी। आपको प्रोग्राम से बाहर निकलने की आवश्यकता नहीं है, केवल एक थ्रेडेड File.list() कॉल का उपयोग करके निर्देशिका को क्रॉल करें। मैंने कट-एन-पेस्ट किया है कि मैं इसे कैसे संभालता हूं। इस कोड को ...

1) एक मुद्दा

2) सेट एक ध्वज लॉग कर निर्देशिका पुन: संसाधित है कि एक निर्देशिका

3 में सभी फाइलों को क्रॉल है) को गति प्रदान करने के लिए इस के प्रसंस्करण के बाकी रुक जाती है WatchEvent

// log overflow events and trigger reprocess later. 
if (kind == OVERFLOW) 
{ 
    logger.warn("File listener recieved an overflow event. You should probably check into this"); 
    overflowTriggeredFlag = true; 
    continue; 
} 
संबंधित मुद्दे

 संबंधित मुद्दे