problem mit großem SOAP Response

malt1981

Mitglied
Hallo zusammen,
ich habe ein Problem mit einem SOAP Aufruf. Der untenstehende Code funktioniert zwar grundsätzlich, leider aber nicht bei einer größeren Datenmenge die zurück kommt. Der Soap Service auf der Gegenseite liefert einen sehr einfachen Body zurück, mit einem xml in einem cdata Feld. Ist das xml im cdata überschaubar (2-3mb) funktioniert es, ist das cdata Feld jedoch sehr groß (ca. 17 mb) kommt das Programm nicht zum Ende. Prozessorauslastung bei 35% Arbeitsspeicher füllt sich sehr langsam ... nach mehreren Minuten läuft das Ganze immer noch. Sprich: im untenstehenden Code kommt noch "Response bekommen", das System.out.println kommt nicht mehr. Die Console schweigt - keine Fehlermeldung... Programm läuft in Eclipse. Kann mir hier jemand einen Tipp geben?

Java:
// SOAPConnectionFactory
        SOAPConnectionFactory soapConnectionFactory = null;
        try {
            soapConnectionFactory = SOAPConnectionFactory.newInstance();
        } catch (UnsupportedOperationException e1) {
            services.Log.log("e", e1.toString());
            e1.printStackTrace();
        } catch (SOAPException e1) {
            services.Log.log("e", e1.toString());
            e1.printStackTrace();
        }
        
        // SOAPConnection
        SOAPConnection soapConnection = null;
        try {
            soapConnection = soapConnectionFactory.createConnection();
        } catch (SOAPException e1) {
            services.Log.log("e", e1.toString());
            e1.printStackTrace();
        }         

        
        try {
            
            // Massage Facotory
            MessageFactory messageFactory = MessageFactory.newInstance();
            
            // SOAP Message
            SOAPMessage soapMessage = messageFactory.createMessage();

            // SOAP Part           
            SOAPPart soapPart = soapMessage.getSOAPPart();

            String myNamespace = "xx";
            String myNamespaceURI = "xx";

            // SOAP Envelope
            SOAPEnvelope envelope = soapPart.getEnvelope();
            envelope.addNamespaceDeclaration(myNamespace, myNamespaceURI);

            // SOAP Body
            SOAPBody soapBody = envelope.getBody();
            SOAPElement soapBodyElem = soapBody.addChildElement("xxx", myNamespace);
            
            SOAPElement soapBodyElem1 = soapBodyElem.addChildElement("xxx");
            soapBodyElem1.addTextNode(xxx);
            
            SOAPElement soapBodyElem2 = soapBodyElem.addChildElement("xxx");
            soapBodyElem2.addTextNode(xxx);           
            
                  
            // Soap Header
            MimeHeaders headers = soapMessage.getMimeHeaders();
            headers.addHeader("SOAPAction", "xxx");

            // Soap Message speichern
            soapMessage.saveChanges();
            
            String webServiceUrl = main.SmallJobs.webServiceUrl + "xxx";
            SOAPMessage soapResponse = soapConnection.call(soapMessage, webServiceUrl);
            
            log("Response bekommen... ");
          
            System.out.println("Kontent" + soapResponse.getSOAPBody().getTextContent());
 
Nachtrag: Klappt, wenn ich den Response in einen String schreibe über einen ByteArrayOutputStream.
Ist aber sicher nicht die feine Art. Also wenn jemand einen bessren Tipp hat, immer noch gerne.
 
ich habe ein Problem mit einem SOAP Aufruf.
Also in Kurz: du hast einen SOAP Aufruf? 🙂

nach mehreren Minuten läuft das Ganze immer noch. Sprich: im untenstehenden Code kommt noch "Response bekommen", das System.out.println kommt nicht mehr. Die Console schweigt - keine Fehlermeldung... Programm läuft in Eclipse. Kann mir hier jemand einen Tipp geben?
Gibt ja nur zwei Möglichkeiten: entweder es läuft ewi lange, oder es gibt eine Exception, die irgendwo veschluckt wird.

Ein try ist ja schon drum, das catch ist allerdigs nicht zu sehen, dort steht was sinnvolles drin?
Testweise kannst du dort einfach mal alles fangen (also auch Errors), und die Loggen lassen, zur Not auch einfach im finally-Block.

Wenn es einfach nur lange läuft kannst du den Debugger anwerfen und mal gucken oder einfach einen Threaddump machen, und dort mal genau gucken, wo es hängt.


BTW: das Exceptionhandling, was man dort sieht, ist quasi nicht existent und in der Form nicht wirklich sinnvoll – wenn irgendein Fehler fliegt, fliegt danach eine NPE.
 
ok, vielen Dank. Exceptionhandling habe ich angepasst. Leider immer noch keine Fehlermeldung, nur eben unglaublich lange Rechenzeit. Ich versuche jetzt mal wie vorgeschlagen dem Threaddump etwas zu entlocken.
 

Neue Themen


Zurück
Oben