Jan Peters-Anders: Servlet: Von php aus geschriebenes File prüfen

Hallo allerseits,

ich habe ein etwas kniffliges Problem: Da ich zwei Applikationen für ein Projekt miteinander verbinden muss (ein Java Servlet und eine php Anwendung) muss ich momentan mit:

Runtime.getRuntime().exec(php_command);

ein php file ausführen, dass seinerseits ein Log File auf die Platte schreibt. Was es auch tut, soweit so gut. Mein Java Servlet soll dann im Anschluss das File lesen (was es unter Windows/Tomcat) auch wunderbar macht, nur unter Linux wird die Datei immer nur halb gelesen, obwohl sie vollständig auf der Platte liegt (wie man mit vi leicht feststellen kann). Das sieht dann ungefähr so aus:

Servlet liest nur:
--------------8<----------------------
Integrity check1
0
--------------8<----------------------

obwohls so aussehen sollte:

--------------8<----------------------
Integrity check1
0
Integrity check2
0
Integrity check3
0
--------------8<----------------------

Die Ganzen Geschichten in Java mit File.exists() etc. bringen anscheinend garnichts, da das File existiert, aber halt noch nicht vollständig geschrieben wurde. So Sachen wie:

FileDescriptor fd = os.getFD();
os.flush();
fd.sync();

bringen mir auch nichts, da dann das System rumschreit, es seien zu viele Files offen (was wohl daher kommt, dass das File ja gerade von php geschrieben wird).

Nun meine Frage: Weiß vielleicht jemand hier im Forum wie ich (zur Not auch "dirty") das Servlet solange in Schach halten kann, bis das File vollständig geschrieben wurde? Bzw. wie ich mit Java herausfinden kann, ob das File momentan noch größer wird, vollständig geschrieben wurde (dürfte schwierig werden, wenn ich die Endgröße nicht weiß) oder ähnliches? (Natürlich sind auch wesentlich weitergehende Vorschläge willkommen).

Danke schon mal im Voraus

Jan

  1. hallo,

    ich habe ein etwas kniffliges Problem

    Normalerweise fangen die "Regulars" hier im Forum zu gähnen an, wenn jemand von "kniffligen" Problemen redet. Bei dir scheint es aber tatsächlich etwas "knifflig" zu sein.

    Mein Java Servlet soll [...] das File lesen (was es unter Windows/Tomcat) auch wunderbar macht, nur unter Linux wird die Datei immer nur halb gelesen

    Tomcat muß konfiguriert werden, um überhaupt PHP ausführen lassen zu können. Und diese Konfiguration kann unter Windows erheblich anders aussehen als unter Linux.

    Das sieht dann ungefähr so aus

    Ich fürchte, daß das, was du als Information mitpostest, nicht wirklich zur Problemlösung beitragen kann. Vermutlich sind weder dein Servlet (das man sich allerdings vollständig anschauen müßte), noch dein PHP-Script (das man sich zur Problemlösung wohl ebenfalls vollständig ankucken müßte) dra "schuld", sondern die Serverkonfiguration. Die Zusammenarbeit von Servlets und PHP-Scripts ist alles andere als trivial.

    Die Ganzen Geschichten in Java mit File.exists() etc. bringen anscheinend garnichts, da das File existiert, aber halt noch nicht vollständig geschrieben wurde. So Sachen wie [...] bringen mir auch nichts, da dann das System rumschreit, es seien zu viele Files offen

    Womit es vermutlch sehr recht hat.

    (was wohl daher kommt, dass das File ja gerade von php geschrieben wird).

    Das solltest du bitte erläutern: wer schreibt jetzt was? Schreibt dein Servlet dein PHP-Script, oder schreibt dein PHP-Script erst das Servlet? Nach deiner "Einleitungskurve" soll dein Servlet nur das Script aufrufen, also nicht neu schreiben.

    Grüße aus Berlin

    Christoph S.

    --
    Visitenkarte
    ss:| zu:) ls:& fo:) va:) sh:| rl:|
  2. Hallo,

    da es ja irgendwie so aussieht, als würde dein Java-Programm die Datei
    zu früh anfangen zu lesen, also noch bevor das PHP-Programm die Datei
    vollständig geschrieben hat, würde möglicherweise ein Aufruf von
    Process.waitFor() dein Problem beheben. Damit wartet dein Programm so
    lange, bis der zuvor über exec() gestartete PHP-Prozess beendet wurde.
    Erst dann ist die Datei ja mit Sicherheit vollständig geschrieben.

    Gruß
    Slyh

    1. hallo Slyh,

      mich freut es wirklich, zu sehen, wann und warum du dich zu Wort meldest ;-)

      da es ja irgendwie so aussieht, als würde dein Java-Programm die Datei
      zu früh anfangen zu lesen, also noch bevor das PHP-Programm die Datei
      vollständig geschrieben hat, würde möglicherweise ein Aufruf von
      Process.waitFor() dein Problem beheben.

      Das würde sich unter Umständen auch in der Serverkonfiguration einstellen lassen. Mir ist das "Einsatzgebiet" noch zu wenig umrissen.

      Damit wartet dein Programm so
      lange, bis der zuvor über exec() gestartete PHP-Prozess beendet wurde.

      ACK. Nur: ich fürchte, daß das Servlet selber gar nicht dran schuld ist.

      Grüße aus Berlin

      Christoph S.

      --
      Visitenkarte
      ss:| zu:) ls:& fo:) va:) sh:| rl:|
      1. Hallo Slyh und Christoph,

        Process.waitFor() dein Problem beheben.

        Das hat anscheinend geholfen, hab bisher noch keine Unregelmäßigkeiten gesehen, mal sehen was die Zukunft bringt...

        Auf jeden Fall herzlichen Dank und schönen Abend noch

        Jan