Hi cxf users and developers,
I'm using MTOM to send large files. This works great for SOAP HTTP
requests. Both the client and server can send the messages with low memory
consumption.
Unfortunately when I use SOAP JMS I get a heap space OutOfMemoryError.
I tried using CXF 3.2.7 and 3.3.0.
Any help is very much appreciated.
This is the stack trace:
Caused by: java.lang.OutOfMemoryError: Java heap space
at java.io.ByteArrayOutputStream.<init>(ByteArrayOutputStream.java:77)
at org.apache.cxf.helpers.IOUtils.readBytesFromStream(IOUtils.java:401)
at
org.apache.cxf.io.CachedOutputStream.getBytes(CachedOutputStream.java:306)
at
org.apache.cxf.transport.jms.MessageStreamUtil$SendingOutputStream.doClose(MessageStreamUtil.java:81)
at
org.apache.cxf.io.CachedOutputStream.close(CachedOutputStream.java:222)
at
org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56)
at org.apache.cxf.transport.jms.JMSConduit.close(JMSConduit.java:104)
at
org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:63)
at
org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308)
at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:531)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:440)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:355)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:313)
at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:96)
at
org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:140)
at com.sun.proxy.$Proxy76.addDocumentMtom(Unknown Source)
I have configure my JaxWsProxyFactoryBean like this:
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
Map<String, Object> props = new HashMap<>();
props.put("mtom-enabled", Boolean.TRUE);
factory.setProperties(props);
factory.setFeatures(Collections.singletonList(new
ConnectionFactoryFeature(connectionFactory)));
factory.setTransportId(JMSSpecConstants.SOAP_JMS_SPECIFICATION_TRANSPORTID);
factory.setServiceClass(DocumentServiceOneWay.class);
factory.setAddress("jms:queue:DocumentServiceQueue?sessionTransacted=true");
Kind regards,
Robert