Servlet empfängt nur Teilstream
Robin
- java
0 Martin Jung0 Robin0 Martin Jung0 Robin0 Martin Jung0 Robin
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
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
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
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
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
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
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.
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\ndas 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):
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