Best Practice für das Ansehen eines Upload-Ordners?

9

Ok, ich habe ein interessantes Problem in meinen Händen. Hier ein kleiner Hintergrund:

Ich schreibe eine Medienbibliothek-Service-Implementierung, die URLs an einen Front-End-Flash-Player liefert. Der Client möchte Inhalte in den Dienst pushen können, indem er Dateien mit einigen Metadaten in einen FTP-Ordner hochlädt - ich habe die Kontrolle über das Metadatenschema. Der Dienst, der diesen Ordner überwacht, nimmt neue Dateien auf, kopiert sie in einen "Inhalts" -Ordner und überträgt dann die Metadaten und URLs an den Inhalt des Inhaltsdienstes und in die Datenbank.

Der Content-Service ist kein Problem, fertig. Beobachten eines FTP-Ordners ist.

Meine aktuelle Implementierung verwendet das FileSystemWatcher-Objekt mit einem Filter für XML-Dateien.

Es kann mehr als eine Datei für jedes Inhaltselement geben, z. hohe, med, niedrige Qualität Videos.

Ich habe vor, entweder durch den Prozess oder durch ein Tool zu erzwingen, dass der Inhalt nur für die Kürze in seinen eigenen Ordnern organisiert wird, aber das ist nicht wirklich ein Problem.

Die XML-Datei sieht ungefähr so ​​aus:

%Vor%

Wenn also eine neue Datei erstellt wird, wird das FileSystemWatcher.Created-Ereignis ausgelöst. Ich habe einen separaten Thread ausgeführt, um den Inhalt zu verarbeiten, der eine Warteschlange mit dem Hauptdienstprozess teilt (mach dir keine Sorgen, es ist das Producer Consumer Pattern wie hier beschrieben: Ссылка ).

Das alles funktioniert gut, aber jetzt laufe ich in Randfälle rechts und zentriert!

Ich habe berücksichtigt, dass das Hochladen der Videos länger dauert, so dass der Prozessor versucht, eine exklusive Sperre zu erhalten. Wenn dies fehlschlägt, wird das Element auf die Rückseite der Warteschlange verschoben und auf das nächste Element verschoben / p>

  • Was passiert, wenn der Dienst abstürzt oder bereits Dateien vorhanden sind? Also habe ich eine Methode geschrieben, um vorhandene Dateien in eine Warteschlange zu stellen.
  • Was passiert, wenn Dateien hochgeladen werden, während sie die vorhandenen Dateien in die Warteschlange stellen? Hoffentlich wird es damit umgehen? Soll ich das Verzeichnis regelmäßig erneut scannen, um zu sehen, ob ich etwas verpasst habe?

Kann jemand eine Best Practice für dieses Szenario empfehlen? Ist der Dateisystemwächter eine gute Idee oder sollte der Dienst den Ordner nur periodisch scannen?

Edit: Nur um Ihnen eine Vorstellung von der Größe zu geben. Wir sprechen über insgesamt zehntausende von Items. Wahrscheinlich in großen Stücken hochgeladen.

    
Rob Stevenson-Leggett 26.02.2009, 09:52
quelle

3 Antworten

3

FileSystemWatcher ist eine pragmatische Methode, um einen Dateiverlust frühzeitig sichtbar zu machen, aber es gibt viele Randfälle, die verpasste Ereignisse verursachen können. Sie würden immer noch einen periodischen Sweep benötigen, um sicher zu sein.

Um so viele Mutex-Probleme zu vermeiden; könnten die clients als foo.xml.upload uploaden, und dann dort in foo.xml umbenennen? Das würde eine lange gesperrte Datei vermeiden ... (Sie ignorieren nur die .upload-Dateien).

Auch: Vorsicht "nicht erfunden hier" ... es gibt viele bestehende Dienstprogramme, die Ordner überwachen; BizTalk for (ein Overkill) -Beispiel. Ich sage nicht "tu es nicht selbst", sondern denke zumindest über vorgefertigte Optionen nach.

    
Marc Gravell 26.02.2009, 09:57
quelle
1

Wenn Sie nach einer Datei -Erstellung Ausschau halten, ist es ein häufiger Fehler, dass Sie Ihr Ereignis erhalten, bevor der Upload abgeschlossen ist, sodass Sie eine unvollständige Datei verarbeiten.

Natürlich können Sie das überprüfen, da das XML einer unvollständigen Datei nicht gut gebildet wird. Aber eine bessere Lösung IMO ist, den Uploader in eine temporäre Datei schreiben zu lassen und nach Abschluss des Uploads die Datei in * .xml umzubenennen.

Wie für den FileSystemWatcher selbst, naja ... Ich bin misstrauisch geworden, wenn es auf einer Netzwerkfreigabe verwendet wird ( delete event wurde nie ausgelöst). Also habe ich meinen eigenen 'Watcher' geschrieben, der eine ähnliche Schnittstelle zum FSW hat, aber nur das Verzeichnis für das Erstellen / Löschen / Ändern von Dateien abfragt. Nicht so elegant wie der FSW, aber zuverlässiger.

    
Treb 26.02.2009 10:21
quelle
0

Möglicherweise möchten Sie einen Webdienst ausführen, bei dem der Uploader beim Abschluss des Uploads einen Ping-Befehl senden kann. nur eine URL würde es gut machen, wie " Ссылка " was nach dem Aufruf jedes Programm startet, das den FTP-Ordner überprüft.

    
Christopher Mahan 26.02.2009 10:04
quelle

Tags und Links