cxf-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Daniel Kulp <dk...@apache.org>
Subject Re: Streaming large attachments by linking input and output stream avoiding temp files
Date Tue, 28 Jul 2009 15:50:47 GMT

Well, I THOUGHT this would have been easily doable, but when I checked, it 
turns out the attachments were not streaming properly in MTOM mode.  :-(

I've gone through and fixed a BUNCH of things related to the attachment 
handling and streaming and such so some of this is now possible.

Now, with the latest code, when you get the DataSource, if at all possible, 
the input stream that is returned will properly be streaming off the wire 
instead of cached.   Thus, you can copy directly from there to the output 
stream.

There are cases where this WON'T work stream directly, notably when schema 
validation is turned on.   In that case, to work around issues in JAXB, we 
buffer the content.     Also, if there are multiple attachments, only the last 
one can really be streamed this way.   The others get buffered.

Dan



On Mon July 27 2009 5:50:00 am dp-isp wrote:
> Hello everybody,
>
> We have a CXF webservice that is a kind of "repository service" and a
> webapp working as frontend for that repository.
> Those two components are on separate hosts.
>
> We would need to realize a continuous stream of data when downloading
> attachments from CXF webservice to the users' browser through the frontend
> webapp.
>
> The webapp is basically a servlet that invokes the webservice, receives the
> attachment datahandler and copies datahandler InputStream to servlet
> response OutputStream (servlet code is at the end of this email).
>
> Our issue: is it possible to directly link datahandler InputStream to
> servlet response OutputStream without re-building the whole attachment in
> memoroy or in a temporary file? (as can be configured by setting
> org.apache.cxf.io.CachedOutputStream.Threshold,
> org.apache.cxf.io.CachedOutputStream.OutputDirectory)
>
> Going more into details, is there a way to send to CXF the output buffer to
> write the attachment on? In such case we would send to CXF the sevlet's
> output buffer.
>
> Alternatively, is there a way to manage CXF working asynchronously with
> attachments, giving back control to the servlet before attachment downolad
> completion?
>
> Many thanks,
> Marco
>
> ---
>
> This is the servlet's involved code:
>
> ...
> StreamingService_Service ss = new StreamingService_Service(new
> URL(serviceURL));
> StreamingService port = ss.getServiceImplPort(new MTOMFeature());
>
> Resume myFile = port.downloadMethod(fileName, fileType, usr, pwd, repo);
> DataHandler handler = myFile.getResume();
>
> response.setHeader("Pragma", "No-cache");
> response.setContentType("application/octet-stream");
> response.setHeader("content-disposition", "attachment; filename=" +
> fileName + "." + fileType);
> try {
> 	InputStream is = handler.getInputStream();
> 	try {
> 		OutputStream os = response.getOutputStream();
> 		try {
> 			byte[] b = new byte[100000];
> 			int bytesRead = 0;
> 			while ((bytesRead = is.read(b)) != -1) {
> 				os.write(b, 0, bytesRead);
> 			}
> 			System.out.println("Download del file " + myFile.getCandidateName() +
> "." + myFile.getResumeFileType() + " completato.");
> 		} finally {
> 			os.flush();
> 			os.close();
> 		}
> 	} finally {
> 		is.close();
> 	}
>
> } catch (Exception e) {
> 	e.printStackTrace();
> }
> ...

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

Mime
View raw message