2013-07-29 8 views
5

Yeni oluşturulan dosyalarda bir dizini ve yangın mantığını izlemek için bir saat hizmetini kullanıyorum. Yakın zamanda yaşadığım zorluklardan biri, yüksek hacimli dosyaların işlenmesi gerektiğinde ve izleme dizinine çok hızlı bir şekilde kopyalanmaya başladığında bir taşmanın tetiklenmesidir.Bir saat hizmetinde pollEvents() taşma türünü düzgün bir şekilde nasıl işlerim?

Dosya sistemleri daha hızlı alındıktan veya işlenebilir daha olayları bildirebilir ve bir uygulama o birikebilir olayların sayısı belirtilmeyen bir sınır getirebilir:

API bu konuda taşması diyor. Bir uygulama bilerek olayları atarsa, o zaman bir olayın OVERFLOW olay türüyle bir öğeyi döndürmesi için, anahtarın pollEvents yöntemini düzenler.

Sorum düzgün işlenmesi gereken olayların hiçbirini kaybetmeden, taşma işleyebilir nasıl olduğunu? Ben pratikte taşma olayı görmedim

  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

Bir taşma *, * olayları kaybettiğiniz anlamına gelir. Bir taşma işlemek ve olayları kaybetmek istemediğinizi söylemek mantıklı değil. –

+0

@PeterLawrey Dokümantasyon ayrıca şunları ifade eder: Bu olay tüketici tarafından nesnenin durumunu yeniden incelemek için tetikleyici olarak kullanılabilir. Bir taşma nedeniyle bir olayı kaybedersem, sıradaki etkinliklerim hala devam eder mi? ve eğer öyleyse, bir sonraki olay kümesini nasıl alabilirim? –

cevap

2

: gibi

Benim watchservice kodu görünüyor. İzlediğiniz dizini yeniden işlemeniz gerekeceğini size bildirmek istedi. Programdan çıkmanıza gerek yoktur, sadece dizini tek bir iş parçacığı olan File.list() çağrısı kullanarak tararsınız. Aşağıda nasıl ele aldığımı kestim. Bu kod ...

1) bir dizinin

3 tüm dosyaları tarayan bir dizin REPROCESS) tetiklemek için

2) ayarlar bir konuyu bir bayrak Kayıtlar bu işlenmesi kalanını atlar 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; 
} 
İlgili konular