Martin Jung: Servlet empfängt nur Teilstream

Beitrag lesen

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