Я пытаюсь загрузить приложение размером 350 МБ через интерфейс SOAP (с включенным MTOM) и отправить вложение в веб-службы axis2.Проблема OutOfMemory при загрузке приложения 350 МБ через веб-службы axis2
Веб-службы Axis2 настроены на включение MTOM на сервере. Кэширование также включено на стороне сервера. После конфигурации есть в axis2.xml:
<parameter name="enableMTOM">true</parameter>
и
<parameter name="cacheAttachments">true</parameter>
<parameter name="attachmentDIR">C:\Temp\TempWS</parameter>
<parameter name="sizeThreshold">8000</parameter>
Максимальный размер кучи в котом устанавливается равным 3000 МБ (см снимок экрана выше), но до сих пор веб услуги бросает меня за исключение:
Java heap space
java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOfRange(Arrays.java:2694)
at java.lang.String.<init>(String.java:203)
at java.lang.StringBuffer.toString(StringBuffer.java:561)
at org.apache.axiom.util.base64.Base64Utils.encode(Base64Utils.java:81)
at org.apache.axiom.om.impl.llom.OMTextImpl.getText(OMTextImpl.java:264)
at org.apache.axiom.om.impl.llom.OMElementImpl.getText(OMElementImpl.java:786)
at org.apache.axis2.databinding.utils.BeanUtil.deserialize(BeanUtil.java:334)
at org.apache.axis2.databinding.utils.BeanUtil.deserialize(BeanUtil.java:407)
at org.apache.axis2.databinding.utils.BeanUtil.processObject(BeanUtil.java:682)
at org.apache.axis2.databinding.utils.BeanUtil.ProcessElement(BeanUtil.java:630)
at org.apache.axis2.databinding.utils.BeanUtil.deserialize(BeanUtil.java:562)
at org.apache.axis2.rpc.receivers.RPCUtil.processRequest(RPCUtil.java:153)
at org.apache.axis2.rpc.receivers.RPCUtil.invokeServiceClass(RPCUtil.java:188)
at org.apache.axis2.rpc.receivers.RPCMessageReceiver.invokeBusinessLogic(RPCMessageReceiver.java:102)
at org.apache.axis2.receivers.AbstractInOutMessageReceiver.invokeBusinessLogic(AbstractInOutMessageReceiver.java:40)
at org.apache.axis2.receivers.AbstractMessageReceiver.receive(AbstractMessageReceiver.java:114)
at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:173)
at org.apache.axis2.transport.http.HTTPTransportUtils.processHTTPPostRequest(HTTPTransportUtils.java:173)
at org.apache.axis2.transport.http.AxisServlet.doPost(AxisServlet.java:144)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
at com.csdcsystems.amanda.servlet.AmandaAxisServlet.service(AmandaAxisServlet.java:103)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
Мои вопросы:
- Может кто-то помочь мне понять, что мне не хватает? Есть ли дополнительная настройка, которая должна быть в конфигурации tomcat?
- Как я могу поддерживать большие вложения для загрузки/загрузки через веб-службы axis2?
Примечание:Служба выполнена с возможностью быть с Byte [] в качестве входного/выходного параметра услуг, игровая.
Где и как вы установили максимальную кучу размер? – cowls
Держитесь; почему в вашей трассе есть какой-то «StringBuffer»? Вы имеете в виду, что вы генерируете строку base64 всего файла_ перед отправкой? Почему вы это вообще делаете? Можете ли вы показать свой код загрузки? – fge
«Сервис настроен на то, чтобы иметь байт [] в качестве параметра ввода/вывода услуг». <- это означает, что вы ждете, чтобы проглотить все это перед отправкой? Не очень умный; почему бы не просто захватить выходной поток соединения и отправить байты при их декодировании (например, используя BaseEncoding от Guava)? – fge