You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@cxf.apache.org by petrmiko <mi...@gmail.com> on 2011/04/26 16:52:32 UTC

MTOM Heap space fault

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.

Re: MTOM Heap space fault

Posted by petrmiko <mi...@gmail.com>.
Yes, that was it! I'm downloading now that large file which caused heap
fault, and so far so good - thank you very much!--
View this message in context: http://cxf.547215.n5.nabble.com/MTOM-Heap-space-fault-tp4341098p4347668.html
Sent from the cxf-user mailing list archive at Nabble.com.

Re: MTOM Heap space fault

Posted by Daniel Kulp <dk...@apache.org>.
On Tuesday, April 26, 2011 10:52:32 AM petrmiko wrote:
> 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.

From the stack trace, the heap space issue is on the Server side, not the 
client.   The server isn't streaming it.

.............snip.........
 
> 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");

This is likely the problem.    The ByteArrayDataSource loads the entire stream 
into a byte[] internally.   Thus, it doesn't really "stream".   You would 
definitely need to switch to a DataSource implementation that can stream.

If the "file" is really a "java.io.File", you could use the 
javax.activation.FileDataSource.   Otherwise, you could likely do something 
like:

final InputStream in = file.getFileContent().getBinaryStream();

rawData = new DataSource() {
                    public String getContentType() {
                        return "application/octet-stream";
                    }

                    public InputStream getInputStream() throws IOException {
                        return in;
                    }

                    public String getName() {
                        return  "application/octet-stream";
                    }

                    public OutputStream getOutputStream() throws IOException {
                        return null;
                    }
                });

....


Hope that helps!
Dan




>             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(Fi
> leDownload.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.j
> ava: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.unmarshalF
> ault(Soap11FaultInInterceptor.java:75)
> 
> org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMess
> age(Soap11FaultInInterceptor.java:46)
> 
> org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMess
> age(Soap11FaultInInterceptor.java:35)
> 
> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChai
> n.java:243)
> 
> org.apache.cxf.interceptor.AbstractFaultChainInitiatorObserver.onMessage(Ab
> stractFaultChainInitiatorObserver.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(PhaseInterceptorChai
> n.java:243)
> org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:700)
> 
> org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleRespons
> eInternal(HTTPConduit.java:2261)
> 
> org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleRespons
> e(HTTPConduit.java:2134)
> 
> org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPCon
> duit.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$MessageSenderEndingInte
> rceptor.handleMessage(MessageSenderInterceptor.java:62)
> 
> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChai
> n.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(Fi
> leDownload.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.j
> ava: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.ht
> ml Sent from the cxf-user mailing list archive at Nabble.com.

-- 
Daniel Kulp
dkulp@apache.org
http://dankulp.com/blog
Talend - http://www.talend.com