2016-04-05 7 views
0

Mein Ziel ist die Verwendung der Daten in einer JSON-Datei ("data.json") für meine Java-Anwendung und meine node.js-Anwendung.Ein data.json zugegriffen und durch mehrere Quellen geändert

Java-Anwendung liest die JSON-Datei und schreibt die Datei nur mit zusätzlichen oder bearbeiteten JSON-Objekten neu.

Ich möchte auch die node.js-Anwendung die JSON-Datei lesen und die Datei mit zusätzlichen oder bearbeiteten JSON-Objekte neu schreiben.

Was ist der beste Weg, dies zu tun? Was sind meine Optionen für die Zusammenarbeit, Synchronisierung und Warteschlange von Änderungen aus jeder Quelle?

Dank

+0

@Archer diese Frage ist eine schlechte Passform für Programmierer - es würde schnell nach unten abgestimmt und geschlossen dort, siehe http://meta.programmers.stackexchange.com/questions/6483/why-was-my- Frage-geschlossen-oder-unten-abgestimmt/6490 # 6490 Empfohlene Lektüre: ** [Was geht Programmers.SE? Eine Anleitung für Stack Overflow] (http://meta.programmers.stackexchange.com/q/7182/31260) ** – gnat

Antwort

0

Offensichtlich die Datei von Korruption auf gleichzeitiges Schreiben zu schützen und liest müssen Sie einige Lock-System implementieren. Zwischen den Threads in einem einzigen Prozess ist es eine triviale Aufgabe, aber zwischen Prozessen ist es nicht so einfach.

Es gibt einen Trick, der auf UNIX-Systemen funktionieren könnte, und er basiert auf der Tatsache, dass das Verfahren zum Umbenennen von Dateien in Unix atomar ist. Basierend auf der Dateiumbenennung könnten Sie einen einfachen Mutex oder sogar eine kompliziertere Schreib-Lese-Semantik implementieren. Verwenden Sie für einen einfachen Mutex die folgende Strategie:

  1. Wenn eine App die Datei verwenden möchte, überprüfen Sie den data* Dateinamen. Wenn es data_locked_<some_pid> ist, warten Sie (oder abonnieren Sie FS-Benachrichtigungen, so dass Sie FS nicht abfragen und CPU-Zeit ausgeben müssen) und wiederholen Sie Schritt 1.
  2. Wenn der Dateiname data ist, versuchen Sie, die Datei in data_locked_<pid> umzubenennen. Wenn der Versuch erfolgreich ist, verwenden Sie die Datei.
  3. Nachdem Sie es mit der Datei umbenennen zurück zu data

Diese einfache Mutex Semantik fertig Arbeit wird die Datei zur Verwendung durch einen einzigen Prozess gesperrt halten, jedoch Operationen sicher gleichzeitig durchgeführt werden lesen, so dass Sie optimieren können die Lösung weiter durch eine ReadWriteLock machen:

Für lautet:

  1. wenn die App was die Datei zu lesen, prüfen Sie, ob der Dateiname data oderist. Versuchen Sie, die Datei in data_readlocked_<original_pid_list + pid> umzubenennen. Wenn der Versuch fehlgeschlagen ist, wiederholen Sie Schritt 1.
  2. Lesen Sie die Datei.
  3. Benennen Sie die Datei so um, dass ihr Name diese Prozess-PID nicht mehr enthält. Wenn diese Prozess-PID die einzige in der Liste ist, benennen Sie sie in data um. Wenn der Umbenennungsversuch fehlgeschlagen ist, wiederholen Sie Schritt 3, bis der Versuch erfolgreich ist.

Für Schreib:

  1. Überprüfen Sie, ob der Dateiname, wenn data. Wenn dies der Fall ist, umbenennen in data_writelocked_<pid>, wenn fehlgeschlagen, wiederholen Sie Schritt 1. Wenn der Dateiname etwas anderes als data ist - warten Sie und wiederholen Sie Schritt 1.
  2. Schreiben Sie in die Datei.
  3. Benennen Sie es um data um.
+0

Was meinst du mit "Wenn es Sperre ist", bitte – Zodzie

+0

@Zodzie oh, sorry, ich habe hat die Antwort bearbeitet, aber vergessen, dieses Stück zu aktualisieren. Bearbeitet jetzt, sollte klar sein. – Petr

Verwandte Themen