Hello,

I've got a web service for downloading file, but in case of larger files,
org.apache.cxf.interceptor.Fault: Java heap space occurs. MTOM should be
enabled (so it should stream and don't do this) and I'm kind of helpless
about this. 

Can anyone please help me?

Here are sources:
Server webservice bean
<jaxws:endpoint id="userDataService"
                   implementor="#userData"
                       address="/UserDataService">
      <jaxws:properties>
            <entry key="mtom-enabled" value="true"/>
      </jaxws:properties>
   </jaxws:endpoint>

Server web service interface:
@MTOM
@WebService
public interface UserDataService {

    @XmlMimeType("application/octet-stream")
    public DataHandler downloadFile(int dataFileId) throws SOAPException;
}

Server implemented method
public DataHandler downloadFile(int dataFileId) throws SOAPException {

        List<DataFile> files =
experimentDao.getDataFilesWhereId(dataFileId);
        DataFile file = files.get(0);

        ByteArrayDataSource rawData = null;
        try {
            rawData = new
ByteArrayDataSource(file.getFileContent().getBinaryStream(),
"fileBinaryStream");
            log.debug("User " + personDao.getLoggedPerson().getUsername() +
" retrieved file " + dataFileId);
        } catch (IOException e) {
            log.error("User " + personDao.getLoggedPerson().getUsername() +
" did NOT retrieve file " + dataFileId);
            log.error(e);
            throw new SOAPException(e);
        } catch (SQLException e) {
            log.error("User " + personDao.getLoggedPerson().getUsername() +
" did NOT retrieve file " + dataFileId);
            log.error(e);
            throw new SOAPException(e);
        }

        return new DataHandler(rawData);
    }

And client code (no Spring):
public void userLogIn(String username, String password, String endpoint)
throws WebServiceException, ConnectException {

        AuthorizationPolicy auth = new AuthorizationPolicy();
        auth.setUserName(username);
        auth.setPassword(password);

        JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();

        factory.setServiceClass(UserDataService.class);
        factory.setAddress(endpoint);

        service = (UserDataService) factory.create();

        client = ClientProxy.getClient(service);
        client.getEndpoint().put("mtom-enabled", "true");

        conduit = (HTTPConduit) client.getConduit();
        conduit.setAuthorization(auth);

        TLSClientParameters params = new TLSClientParameters();
        params.setDisableCNCheck(true);
        params.setUseHttpsURLConnectionDefaultSslSocketFactory(false);
        params.setTrustManagers(new TrustManager[]{new
AcceptAllTrustManager()});
        conduit.setTlsClientParameters(params);

        HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
        httpClientPolicy.setConnectionTimeout(1000 * 60 * 60);
        httpClientPolicy.setReceiveTimeout(1000 * 60 * 60 * 60);

        conduit.setClient(httpClientPolicy);

    }

    public void userLogout() {

        if (conduit != null)
            conduit.close();

        if (client != null)
            client.destroy();

        conduit = null;
        client = null;
    }
 
The fault is:

Java heap space
 

Message:
    javax.xml.ws.soap.SOAPFaultException: Java heap space
Level:
    SEVERE
Stack Trace:
Java heap space
    org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:146)
    $Proxy57.downloadFile(Unknown Source)
   
ch.ethz.origo.jerpa.application.perspective.ededb.logic.FileDownload.run(FileDownload.java:94)
    java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
    java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
    java.util.concurrent.FutureTask.run(FutureTask.java:138)
   
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
   
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    java.lang.Thread.run(Thread.java:662)
Java heap space
   
org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.unmarshalFault(Soap11FaultInInterceptor.java:75)
   
org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:46)
   
org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:35)
   
org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:243)
   
org.apache.cxf.interceptor.AbstractFaultChainInitiatorObserver.onMessage(AbstractFaultChainInitiatorObserver.java:99)
   
org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:69)
   
org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:34)
   
org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:243)
    org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:700)
   
org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponseInternal(HTTPConduit.java:2261)
   
org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.java:2134)
   
org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1988)
    org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:66)
    org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:639)
   
org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62)
   
org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:243)
    org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:487)
    org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:313)
    org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:265)
    org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:73)
    org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:124)
    $Proxy57.downloadFile(Unknown Source)
   
ch.ethz.origo.jerpa.application.perspective.ededb.logic.FileDownload.run(FileDownload.java:94)
    java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
    java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
    java.util.concurrent.FutureTask.run(FutureTask.java:138)
   
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
   
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    java.lang.Thread.run(Thread.java:662)

--
View this message in context: 
http://cxf.547215.n5.nabble.com/MTOM-Heap-space-fault-tp4341098p4341098.html
Sent from the cxf-user mailing list archive at Nabble.com.

Reply via email to