[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
 
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?
 
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).
 

Neue Themen


Zurück
Oben