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