Robin: Servlet empfängt nur Teilstream

Hallo,

ich habe ein Servlet erstellt, dass einen XML-Stream um ein Attriut anreichern soll. Das Servlet läuft auf einem Server und empfängt Requests von entfernten Rechnern.

Vom Nachrichten-Inhalt kommen nur die ersten Zeichen an (mal 3, mal 5, usw.), daher wird ein Fehler erzeugt.

Merkwürdigerweise funzt es nur dann nicht, wenn der entfernte Rechner auf ein Servlet auf genau diesem Server sendet. Wird von dem Server direkt auf das Servlet gesendet, klappt es, ebenso, wenn das Servlet auf einem anderen Rechner eingebunden wird.

Wer weiss Rat?
Robin

  1. Hi,

    ich habe ein Servlet erstellt, dass einen XML-Stream um ein Attriut anreichern soll. Das Servlet läuft auf einem Server und empfängt Requests von entfernten Rechnern.

    Vom Nachrichten-Inhalt

    Response- oder Request-Nachricht?

    kommen nur die ersten Zeichen an (mal 3, mal 5, usw.), daher wird ein Fehler erzeugt.

    Was für ein Fehler? Welche Komponente erzeugt den Fehler? Gibt es weitere Log-Einträge?

    Merkwürdigerweise funzt es nur dann nicht, wenn der entfernte Rechner auf ein Servlet auf genau diesem Server sendet.

    ???? Auf was bezieht sich "diesem"? Was ist an "diesem" Server besonderes?

    Wird von dem Server direkt auf das Servlet gesendet, klappt es, ebenso, wenn das Servlet auf einem anderen Rechner eingebunden wird.

    Wie meinen?????

    Viele Grüße,
    Martin Jung

    1. Hi Martin,

      ich habe ein Servlet erstellt, dass einen XML-Stream um ein Attriut anreichern soll. Das Servlet läuft auf einem Server und empfängt Requests von entfernten Rechnern.

      Vom Nachrichten-Inhalt
      Response- oder Request-Nachricht?

      Request

      kommen nur die ersten Zeichen an (mal 3, mal 5, usw.), daher wird ein Fehler erzeugt.
      Was für ein Fehler? Welche Komponente erzeugt den Fehler? Gibt es weitere Log-Einträge?

      Der Fehler wird erzeugt, weil eben nur die ersten Buchstaben ankommmen (dann geht irgendwo ein String-Index kaputt - ist aber wie gesagt ein Folgefehler)

      Merkwürdigerweise funzt es nur dann nicht, wenn der entfernte Rechner auf ein Servlet auf genau diesem Server sendet.
      ???? Auf was bezieht sich "diesem"? Was ist an "diesem" Server besonderes?

      Ok, vieleicht ist es so verständlicher:
      Laptop->Servlet auf Server: geht nicht; wird aber gebraucht
      Server->Servlet auf Server: geht
      Server->Servlet auf Laptop: geht

      geht nicht soll heissen: Von der Payload kommen nur wenige Zeichen an.

      Dieser Server ist eine SAP-Exchange-Infrastructure mit J2EE-Engine.

      Wird von dem Server direkt auf das Servlet gesendet, klappt es, ebenso, wenn das Servlet auf einem anderen Rechner eingebunden wird.
      Wie meinen?????

      Grüße von Robin

      1. Hi,

        ich habe gerade kaum Zeit, daher nur kurz:

        Ok, vieleicht ist es so verständlicher:
        Laptop->Servlet auf Server: geht nicht; wird aber gebraucht
        Server->Servlet auf Server: geht
        Server->Servlet auf Laptop: geht

        Kann das ein Hinweis darauf sein, dass es sich möglicherweise nur scheinbar um ein Java/Tomcat-Problem handelt?

        Viele Grüße,
        Martin Jung

        1. Kann das ein Hinweis darauf sein, dass es sich möglicherweise nur scheinbar um ein Java/Tomcat-Problem handelt?

          Ich denke das es kein Problem in der Programmierung ist. Könnte es sein das er irgendwie ein Timeout bekommt, bevor er die Daten zum Servlet gesendet hat ?

          Oder das der Port der Servlet Engine die Daten irgendwie blockiert?

          Gruß,
          Robin

          1. Hi,

            Ich denke das es kein Problem in der Programmierung ist. Könnte es sein das er irgendwie ein Timeout bekommt, bevor er die Daten zum Servlet gesendet hat ?

            Eine Möglichkeit, aber nur, wenn auf beiden Rechnern für Tomcat und die Clients unterschiedliche Konfigurationen verwendet werden. Ich gehe aber davon aus, dass du bei deinen Tests identische verwendet hast.
            Sind die Request-Nachrichten so lang, dass Timeout-Probleme theoretisch denkbar sind?

            Oder das der Port der Servlet Engine die Daten irgendwie blockiert?

            Sind Firewalls oder sonstige Protection-Systeme aktiv (hast Du vielleicht auf dem Laptop XP2 installiert?)? Wenn ja, schon einmal deaktiviert? Der "Port" wird ja vom OS zur Verfügung gestellt.

            Die String-Fragmente, die ankommen, sind korrekt? Vielleicht gibt es auf dem Laptop-Clienten Enkodierungsprobleme, so dass auf dem Server Zeichen als "Stop"-Sequenzen (warum auch immer) erkannt werden.

            'Äußert' sich Tomcat selbst zum abgebrochenen Request in seinem Log?
            Es wird wohl auf eine Debug-Session hinauslaufen.

            Viele Grüße,
            Martin Jung

            1. Eine Möglichkeit, aber nur, wenn auf beiden Rechnern für Tomcat und die Clients unterschiedliche Konfigurationen verwendet werden. Ich gehe aber davon aus, dass du bei deinen Tests identische verwendet hast.
              Sind die Request-Nachrichten so lang, dass Timeout-Probleme theoretisch denkbar sind?

              Auf dem Server läuft kein Tomcat. Es handelt sich dabei um ein SAP J2EE Engine 6.20, da gibt es einen Servlet Container in welchem das Servlet läuft. Um zu Testen ob das Servlet überhaupt in diesem Container läuft, hab ich eine doGet Methode geschrieben und mit einem Browser das Servlet aufgerufen das Funktioniert auch ohne Probleme.
              Und wie schon gesagt wenn ich die Nachricht vom Server aus auf den Servlet Container sende funktioniert es ja auch.(Mit dem wfetch Tool. Ein Tool was Post Request erzeugen kann).

              Die Nachricht Selbst sieht so aus :
              <?xml version="1.0" ?>\r\n
              <MESSAGE>\r\n
              <REQUEST>\r\n
              <DATA>Hallo XI\r\n
              </DATA>\r\n
              </REQUEST>\r\n
              </MESSAGE>\r\n

              das sollte eigendlich nicht zu lang sein.
              Und wenn ich mit dem gleichen Tool die Nachrichten vom Server auf meinen Laptop (auf den Tomcat oder den SUN Appliation Server schicke) geht es auch.
              Nur wenn ich mit dem Tool von meinem Laptop auf das Servlet im SAP J2EE Servlet Container eine NAchricht Schicke(POST REQUEST) bekomme im wfetch Tool den response :
              <HTML><TITLE> SAP J2EE Engine/6.20</TITLE><BODY><H1>Internal Server Error 500!</H1><br><br><br><br><pre>java.io.IOException: Client lost or synchronization error! No data read for the timeout of 10000milliseconds.\r\n
              \tat com.inqmy.services.httpserver.server.HttpInputStream.read(HttpInputStream.java:113)\r\n
              \tat com.inqmy.services.servlets_jsp.server.ServletInputStreamImpl.read(ServletInputStreamImpl.java:121)\r\n
              \tat com.inqmy.services.servlets_jsp.server.ServletInputStreamImpl.read(ServletInputStreamImpl.java:91)\r\n
              \tat java.io.InputStreamReader.fill(InputStreamReader.java:168)\r\n
              \tat java.io.InputStreamReader.read(InputStreamReader.java:244)\r\n
              \tat java.io.BufferedReader.fill(BufferedReader.java:134)\r\n
              \tat java.io.BufferedReader.readLine(BufferedReader.java:294)\r\n
              \tat java.io.BufferedReader.readLine(BufferedReader.java:357)\r\n
              \tat doorlock.Doorlock.doPost(Doorlock.java:72)\r\n

              Wenn ich den Inputstream anders einlese im Servlet selbst und mit das ausgeben lasse was er eingelesen hat, kommt keine Fehlermeldung und in der Response stehen nur die paar Zeichen.

              Die Meldung oben kommt weil ich mit folgendem code auf die Daten zugreifen will:

              String inputString="";
                BufferedReader bufString = new BufferedReader(new InputStreamReader(request.getInputStream()));
              for (String buf;(buf = bufString.readLine()) != null;inputString+=buf + "\n");

              die Zeile for ist die Zeile 72 die den Fehler wirft im doorlock Servlet. Aber wie gesagt das ist nur der Folge Fehler weil er keine Daten im InputStream hat.

              Sind Firewalls oder sonstige Protection-Systeme aktiv (hast Du vielleicht auf dem Laptop XP2 installiert?)? Wenn ja, schon einmal deaktiviert? Der "Port" wird ja vom OS zur Verfügung gestellt.

              Firewalls etc. sind alle aus.

              Die String-Fragmente, die ankommen, sind korrekt? Vielleicht gibt es auf dem Laptop-Clienten Enkodierungsprobleme, so dass auf dem Server Zeichen als "Stop"-Sequenzen (warum auch immer) erkannt werden.

              Die Teile die ankommen sind von der Nachricht meistens die ersten 2 bis 5 Zeichen.
              Also:
              <?xml
              oder
              <?
              so oder ähnlich sieht es aus.

              1. Hi,

                Auf dem Server läuft kein Tomcat. Es handelt sich dabei um ein SAP J2EE Engine 6.20, da gibt es einen Servlet Container in welchem das Servlet läuft.

                Macht das Ganze generell gleich einmal deutlich komplexer ;-) Leider (oder soll ich sagen: zum Glück? ;-) ) kenn ich die Engine nicht.

                Um zu Testen ob das Servlet überhaupt in diesem Container läuft, hab ich eine doGet Methode geschrieben und mit einem Browser das Servlet aufgerufen das Funktioniert auch ohne Probleme.

                Hast Du Dir nur irgendeinen Response im Browser anzeigen lassen (Servlet läuft, ist ansprechbar und antwortet), oder den XML-String mittels Formular und POST geschickt (Servlet läuft, ist ansprechbar, antwortet und empfängt vollständigen XML-String und schickt ihn zurück)?

                Und wie schon gesagt wenn ich die Nachricht vom Server aus auf den Servlet Container sende funktioniert es ja auch.(Mit dem wfetch Tool. Ein Tool was Post Request erzeugen kann).

                Meinst Du hierbei mit "Server" den selben Rechner? Und der generalisierte Schluss aus diesem Experiment lautet: Läuft die Client-Applikation auf der selben Hardware wie die SAP-Engine, gibt es keine Probleme?

                Die Nachricht Selbst sieht so aus :
                <?xml version="1.0" ?>\r\n
                <MESSAGE>\r\n
                <REQUEST>\r\n
                <DATA>Hallo XI\r\n
                </DATA>\r\n
                </REQUEST>\r\n
                </MESSAGE>\r\n

                das sollte eigendlich nicht zu lang sein.

                Nicht wirklich ;-)

                Und wenn ich mit dem gleichen Tool die Nachrichten vom Server auf meinen Laptop (auf den Tomcat oder den SUN Appliation Server schicke) geht es auch.

                Und wenn auf dem Laptop statt Tomcat die SAP J2EE Engine 6.20 läuft***? (Muss Du halt 'mal schnell installieren ;-))) )

                Nur wenn ich mit dem Tool von meinem Laptop auf das Servlet im SAP J2EE Servlet Container eine NAchricht Schicke(POST REQUEST) bekomme im wfetch Tool den response :
                <HTML><TITLE> SAP J2EE Engine/6.20</TITLE><BODY><H1>Internal Server Error 500!</H1><br><br><br><br><pre>java.io.IOException: Client lost or synchronization error! No data read for the timeout of 10000milliseconds.\r\n

                Daraus kann ich konkret keine Schlüsse ziehen.

                Was ich noch testen(ausschließen würde):

                • Liegt es am Rechner/Konfiguration: siehe ***
                • ist es ein Problem, dass nur im Kombination der SAP-Engine und einer bestimmten Java-Version auftritt (auch der in der Meldung ausgegebe Fehler kann nur ein Folgefehler sein. Läuft der Server bereits unter 1.4x, bei welcher die Throwable-Klasse um den Root-Cause erweitert wurde? Wenn nein, 'mal umstellen und schauen, ob die Excpetion weitere Informationen offenbart.

                Wenn ich den Inputstream anders einlese im Servlet selbst und mit das ausgeben lasse was er eingelesen hat, kommt keine Fehlermeldung und in der Response stehen nur die paar Zeichen.

                Ich bin verwirrt (oder habe etwas überlesen). Was heißt "anders einlese im Servlet selbst"? Anders als was?

                Die Meldung oben kommt weil ich mit folgendem code auf die Daten zugreifen will:

                String inputString="";
                  BufferedReader bufString = new BufferedReader(new InputStreamReader(request.getInputStream()));

                Was passiert mit folgendem Code?
                BufferedReader bufString = new BufferedReader(request.getReader());

                Die Teile die ankommen sind von der Nachricht meistens die ersten 2 bis 5 Zeichen.
                Also:
                <?xml
                oder
                <?
                so oder ähnlich sieht es aus.

                Wenn die Fragmentierung eine Musterung erkennen lässt, tippe ich immer noch auf eine Art von Encoding-Problem.

                Weißt Du, ob bei den funktionierenden Setups, der von der Servlet-Engine empfangene XML-String identisch mit dem gesendeten ist? (Könntest Du prüfen, wenn Du den String im Response retournierst und im Clienten mittel .equals() auf Wertgleichheit mit dem Original prüfst). Wenn ja, wäre es villeicht auch einmal sinnvoll, bestimmte Character des gesendeten Strings mit den entsprechenden der Fragmente zu vergleichen, nämlich <?xml* bzw. <?*.

                Mehr fällt mir jetzt auch nicht ein.

                Viele Grüße,
                Martin Jung