This sounds very strange to me, since I was under the assumption that using an 
MTOM-enabled CXF service and a DataHandler, one could stream the data without 
having to store it in its entirety on either side. Ie, in theory one could 
transfer a 100GB file between two machines that both has little RAM and were 
the client machine has a very limited disk space (ie smaller then 100GB), as 
long as the client handles the data as it reads it from the stream, without 
writing it to disk. Are you saying that this is impossible? So the answer in 
this thread:

http://stackoverflow.com/questions/3850399/transfer-large-messaeges-with-apache-cxf

...is wrong?

And what you are saying is that even if I never read the InputStream, if the 
InputStream is mapped to a 100GB blob in the database, the entire 100GB data 
will be transfered? This is really bad news for me, but good that I asked so I 
can fix it. The solution I'm leaning against now is to split this entity into 
two different entities, one with the metadata, and one with the Blob, so one 
has to specifically request the binary data in order to get it.

/Jimi

________________________________________
Från: Benson Margulies [[email protected]]
Skickat: den 8 oktober 2010 15:16
Till: [email protected]
Ämne: Re: When transfering an object with a DataHandler field, is it OK not to 
read from the InputStream?

On the wire, that blob has to travel as a MIME part. And there might
be several such MIME parts. Unless you traffic in interceptors, as far
as I know, the entire content will be pulled into memory, unless it's
very big, in which case it ends up in a temp file. CXF can't just
leave the socket that the data is arriving on sitting there waiting
for you to read the stream on the data handler.


2010/10/8 Jimi Hullegård <[email protected]>:
> Hi,
>
> I have set up a simple webservice for testing, where the object to transfer 
> contains a bunch of simple fields, and then a DataHandler for some binary 
> data (a Blob, actually). It works just fine, and some test with large files 
> (500MB) proved to me that it really works without having the entire data in 
> memory on the server or on the client.
>
> But then I realised that in most use cases, we will not need this binary 
> data, so on the client side we will not read from the InputStream of the 
> DataHandler. But can that cause any problem? Because when I think about it I 
> don't really know how CXF handles this DataHandler. Maybe it assumes that the 
> entire content of the DataHandler InputStream will be sent, and that it keeps 
> the connection open until the client has finished reading, or until some 
> timeout. Or maybe it assumes the opposite, that it can close the connection 
> after it has transfered the "normal" data, and then open a new connection if 
> the client starts to read from the InputStream of the DataHandler.
>
> If it is something like the first scenario, that what can I do to transfer 
> this object the right way, without having to read the InputStream? I can't 
> find any information about this in the documentation.
>
> Regards
> /Jimi

Reply via email to