2016-05-19 5 views
0

In meiner Ruby on Rails App habe ich eine Routine, die in eine Datei schreibt (über eine Java-Anwendung) und dann die geschriebene Datei liest.Datei schreiben geschieht asynchron?

write_to_file(file.path, data) 
read_file(file.path) 

Die meiste Zeit funktioniert das gut. Aber manchmal sieht es so aus, als wäre die Datei nicht geschrieben worden, aber es gab auch keine Fehler. Und wenn ich die Routine mit den gleichen Daten wiederhole, hat es jedes Mal funktioniert.

Ich habe begonnen zu denken, ob die Datei schreiben asynchron passiert und die Datei tatsächlich gelesen wird, bevor die Daten auf die Festplatte geschrieben werden. Wäre das möglich?

write_to_file ruft eine Java-Anwendung über eine Socketverbindung auf, die sich um das Schreiben kümmert. Die Java-Anwendung gibt eine einfache JSON-Zeichenfolge an Rails zurück.

Antwort

0

Möglicherweise kommt es bei der Pufferung von Dateien vor, dass kleine Datenmengen nicht in die Datei geschrieben werden, wenn sie nicht gelöscht werden. Ich bin mir nicht sicher, welche Schnittstelle Sie hier verwenden, aber die flush Methode soll mit dieser genauen Situation umgehen.

3

Diese Frage ist wirklich "Was macht der Java-Code?" und ist nicht wirklich eine Ruby-Frage. Es ist nicht wirklich eine Java-Frage, denn die Sprache Java erlaubt (natürlich) jede Art von Implementierung.

Der Java-Code könnte sicherlich zurückkehren, bevor die Datei zum Lesen verfügbar ist. Wir haben keine Ahnung. Es könnte zum Beispiel eine Anfrage an eine Warteschlange senden und dann zurückgeben.

Der Java-Code ist, was Sie betrachten müssen. Wenn Sie mit, dass wollen nicht stören, könnte man immer etwas tun:

sleep 0.01 until File.readable?(file.path) 

Das ist ein bisschen grob und es gibt elegantere Wege, dies zu tun, aber es funktionieren würde.

+0

Ich habe nur eine Lösung mit 'Schlaf' hinzugefügt. –

+0

Danke. Ist die 'Datei.lesbar?' Genug? Ich meine, mein Prozess konnte die Datei lesen, aber der Inhalt wurde nicht aktualisiert. Die Java-App ändert eine vorhandene Datei und erstellt keine neue Datei. Soll ich den Zeitstempel der Datei betrachten, um festzustellen, ob die Datei wirklich aktualisiert wurde? – Mika

+0

Hmm .. Die Datei Zeitstempel enthält nur Sekunden. All das kann in einer Sekunde passieren. Und in der Java-App verwendet es Apache POI-Funktionen, um eine Excel-Datei zu aktualisieren. Es kommt also wirklich darauf an, wie POI die Datei speichert. – Mika