[AXIS2] OutOfMemory Exception bei Übertragung von größerer Datei via Webservice

Larius

Mitglied
Hallo alle zusammen, ich hoffe ihr könnt mir etwas weiterhelfen.

Ich verwende momentan einen AXIS2 Webservice, welcher in der Lage sein soll, Screenshots und Videos (also Dateien welche wohl so an die 100+ MB haben werden) zu übermitteln. In der AXIS2 Dokumentation steht drinnen, dass dies mithilfe des javax.activation.DataHandler möglich ist (direkt als File übertragen funktioniert nicht, da müsste ich das Ganze erst encodieren damit es mit SOAP übertragen werden kann).

Jetzt ist meine Webservice-Funktion verfügbar und funktioniert auch für kleinere Bilder, aber: Versuche ich nun größere Dateien (>200 MB) zu übertragen macht mir anscheinend Axis2 mit einem OutOfMemory: Java Heap Space schlapp. MTOM Übertragung, Attachements sowie Caching sind aktiviert (sowohl im Client als auch im Server), jedoch soll es lt. Axis2 Seite möglich sein bis zu 1 GB Daten zu Übertragen (darüber haben sie nicht getestet). Ich hab auch schon mittels -Xmx1024M den Speicher am Server höher eingestellt, hat auch nicht wirklich Früchte getragen. Der Client erreicht zwar die Logger-Marke, dass er jetzt auf den Webservice schreibt aber es wird niemals der Logger in der Funktion ausgelöst weil es vorher zu der Exception kommt.

Gibt es nun irgendeine Möglichkeit, dass ich Axis2 sagen kann, dass es bitte die Datei in kleinen Chunks übertragen soll? Mein Client sowie Server sehen wie folgt aus:

Client:
Java:
TestSaveResult result = new TestSaveResult();
result.setState("Failed");
result.setDetailMessage("Exception in WebserviceConnector");
result.setMessage("Fehler bei der Berechnung in Foo");
result.setScreenshot("P:\\LoremIpsum.txt");
TestActionLogger.logDebug("Startzeit Screenshot in DataHandler einlesen");
DataHandler dataHandler = new DataHandler(new FileDataSource(new File(result.getScreenshot())));
TestActionLogger.logDebug("Endzeit Screenshot in DataHandler einlesen");
result.setScreenshotData(dataHandler);
result.setScreenshotEncoding("Base64");
result.setScreenshotExtension("txt");
result.setTaConnectorID(response.get_return());
result.setVideo("");
result.setVideoData("");
result.setVideoEncoding("");
result.setVideoExtension("");
TestActionLogger.logDebug("Start zum Übertragen der Nachricht via Webservice");
stub.testSaveResult(result);

Server:

Java:
public void testSaveResult(String taConnectorID, String state, String message, String detailMessage, String screenshot, String screenshotEncoding, String screenshotExtension, DataHandler screenshotData, String video, String videoEncoding, String videoExtension, String videoData)
  {
    TestActionLogger.logDebug("Aufruf der testSaveResult Methode am Webservice");
    controller.saveResult(taConnectorID, state, message, detailMessage, screenshot, screenshotEncoding, screenshotExtension, screenshotData, video, videoEncoding, videoExtension, videoData);
    TestActionLogger.logDebug("Beendigung der testSaveResult Methode am Webservice");
  }

public void saveResult(String state, String message, String detailMessage, String screenshot, String screenshotEncoding, String screenshotExtension, DataHandler screenshotData, String video, String videoEncoding, String videoExtension, String videoData)
  {
    this.saveResult(state, message, detailMessage, screenshot, screenshotEncoding, screenshotExtension,"", video, videoEncoding, videoExtension, videoData);
    try {
      String tmpFileName = KLTASOAPListener.rootPath + "TestResultResources/" + this.testCase.getID() + "/" + this.currentTestItem.getID() + "." + screenshotExtension;
      final File file = new File(tmpFileName);
      file.getParentFile().mkdirs();
      TestActionLogger.logDebug("Filename fuer Screenshot: " + tmpFileName);
      OutputStream outStream = new FileOutputStream(file);
      DataHandler dataHandler = screenshotData;
      TestActionLogger.logDebug("Startzeit Screenshot auf HDD schreiben");
      dataHandler.writeTo(outStream);
      outStream.flush();
      outStream.close();
      TestActionLogger.logDebug("Endzeit Screenshot auf HDD schreiben");
    }
    catch (FileNotFoundException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
    catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }

Dank euch für eure Mühen.

Lg
Larius
 

Larius

Mitglied
Sorry für den Doppelpost, aber ich konnte mein Problem etwas weiter eingrenzen. Ich hab jetzt mir mehr Arbeitsspeicher in die Maschine gepackt (hatte nur 2 GB in meinem ArbeitsPC) und es somit geschafft, das ich zumindest Files bis zu einer Größe von ~60 MB übertragen kann (auch nur, weil ich Tomcat von Haus aus mit -Xm1024m laufen lasse). ABER: Beim Mitschauen im Windows Task Manager ist mir aufgefallen, dass sich AXIS2 anscheinend den gesamten freien Arbeitsspeicher, welcher noch zur Verfügung steht (also der im Task Manager unter Physikalischer Speicher bei Frei stehende Betrag). Das wäre nun bei einer Datei (200-220 MB) ~900 MB Speicher, den ich benötige. Das ist für meinen Geschmack doch etwas viel, vor allem weil es passieren kann das mehrere große Dateien gleichzeitig übertragen werden. Gibt es irgendeine Möglichkeit dass dieser Vorgang optimiert wird beziehungsweise, dass ich die Datei irgendwie als Stream übermitteln kann ohne das Daten verloren gehen können?
 

Larius

Mitglied
Gut sorry für den Dreifachpost, aber ich habe die Lösung für das Problem gefunden. Evtl. hat jemand ein ähnliches Problem und könnte dann einen hilfreichen Tipp gebrauchen.

Das Problem lag am DataHandler als Parameter. Schaut man ins WSDL-File so entdeckt man den Datentyp "base64Binary", welches von Axis2 zur Übertragung genommen wird. Es ist zwar möglich, dass der DataHandler direkt über den Webservice übergeben wird allerdings konvertiert Axis2 diesen im Hintergrund auf das Base64 Binary, welches verdammt viel Speicher benötigt. Ändert man nun den Parameter um auf Base64Binary funktioniert die Übertragung von größeren Daten ohne Probleme (~228 MB innerhalb von 6 Sekunden übertragen und verarbeitet ohne viel Speicherverbrauch - konnte den Tomcat mit Xm512m starten und hat problemlos geklappt).
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Axis2 Dateien lesen und schreiben - Pfade SOA 1
C SSL in Tomcat mit Axis2 SOA 4
K Axis2 SOAP Logging via Client SOA 2
T Verwendung von Eclipse Projekten im Axis2 Webservice SOA 8
S AXIS2 Webservice: Umgang mit komplexen Datentypen SOA 5
S Axis2 Fault - Wie im Client auslesen? SOA 6
S Axis2 / Rampart - XML-Datei verschlüsseln & versenden SOA 14
J Axis2 und wiederverwenden der Serverobjekte SOA 3
B Axis2 Cipher Suite und Protocol einschränken SOA 2
H Axis2 dynamische URL zu WSDL SOA 2
H Axis2: XML<->DB SOA 2
T Axis2 Problem: leeres Array? SOA 1
S Axis2 MustUnderstand problem mit Boolean SOA 9
F Axis2 große Strings streamen SOA 3
A Axis2 oder 1 Ntlm Authentification SOA 5
J Axis2 und Tomcat SOA 4
T Hat AXIS2 noch Zukunft und wie REST implementieren? SOA 6
R AXIS2 u. Eclipse (Galileo) Fehler bei Serverstart SOA 2
G Stub generieren (WSDL=Axis1.4) (WSDL2JAVA=Axis2) SOA 11
H Axis2 Deployment SOA 5
R SOAP Nachrichtenaustausch zwischen Axis2-WSs SOA 5
S Exception in axis2 java2wsdl ant Task SOA 1
N Request-XML-String -> AXIS2 -> WSDL-Check -> Respon SOA 2
G Axis2 Properties SOA 6
N Axis2: Binärdateien übertragen mit JWS/RPC SOA 2
M Axis2 vs XFire vs JAX-WS SOA 4
N Axis2 - hibernate.cfg.xml - wohin? SOA 6
K Axis2 Service / deploying to Tomcat 5.5.25 / web.xml SOA 5
F Axis2 und Listen SOA 3
I Axis2 mit SSL verschlüsseln SOA 4
N Axis2 - Cliententwicklung SOA 3
G axis2 rampart 1.3 SOA 1
K Webservices mit Axis2 SOA 2
A Restful wird gestoppt, sobald eine Exception geworfen wird SOA 11
E WSDL Exception mit SOAPUI SOA 4
A JAX-WS Timeout wirft keine Exception / bleibt hängen SOA 6

Ähnliche Java Themen

Neue Themen


Oben