Apologies, this DefferredOutputSTream stuff was a pull request I didn't 
review thoroughly enough.  I generally buffer these types of things.

The reason why this case exists is because an incompatibility with 
JAX-RS and Apache Http Client.  Apache HC does not let you modify 
headers within HttpEntity calls.  JAX-RS MessageBodyWriters require 
header modification.  So, I have to buffer the marshalling to memory or 
disk.

We can probably put in a special case for FileInputStream as you note.

On 5/23/2013 1:15 PM, Gendler, Samuel wrote:
> There are also many utility classes available for copying between input
> and output streams or readers and writers which will utilize
> best-practices for maximizing throughput.  Those should be used rather
> than a single byte copy in a tight loop, which is NEVER efficient unless
> the data is only arriving a byte at a time, and that case is handled by
> the fact that any read into a buffer will read UP TO buffer size bytes.
> See ByteStreams.copy() from google’s Guava or IOUtils in commons-io for
> well regarded utility classes.
>
> *From:*Ruusu Reino [mailto:reino.ru...@vtt.fi]
> *Sent:* Thursday, May 23, 2013 9:21 AM
> *To:* resteasy-users@lists.sourceforge.net
> *Subject:* Re: [Resteasy-users] Slow PUT request payload processing in
> client framework
>
> Hello,
>
> I’ve now looked into this a bit deeper. The culprit is a loop that
> copies data a single byte at a time from the InputStream into a
> DeferredFileOutputStream. This loop is in the method
> InputStreamProvider.writeTo().
>
> If the message body is delivered as a File instead of an InputStream,
> the process is much faster, as the data transfer occurs in packages of
> 2048 bytes in a loop at ProviderHelper.writeTo(), called by
> FileProvider.writeTo().
>
> Still, as the data is copied verbatim from the source into a temporary
> file, even when the input is itself a File object, the whole operation
> seems to be quite a bit of waste of valuable resources.
>
> Is there a way to entirely avoid the creation of this quite unnecessary
> temporary file?
>
> Alternatively, there seems to be a property for controlling the
> threshold for the creation of this temporary file, which defaults to
> only 1 MB, in the ApacheHttpClient4Executor class. What is the simplest
> way to tweak this parameter from client code?
>
> -- *
> *Reino Ruusu
> Research Scientist
> VTT Technical Research Centre of Finland / Systems Engineering
>
> *From:*Ruusu Reino [mailto:reino.ru...@vtt.fi]
> *Sent:* 23. toukokuuta 2013 15:49
> *To:* resteasy-users@lists.sourceforge.net
> <mailto:resteasy-users@lists.sourceforge.net>
> *Subject:* [Resteasy-users] Slow PUT request payload processing in
> client framework
>
> Hi,
>
> I’m a new person on this list, and I have encountered an issue with the
> RESTEasy Client Framework.
>
> While trying to transfer a 7.5 MB file over a simple PUT request using
> the client framework, the client freezes for minutes while very slowly
> building a temporary file, with 100% CPU utilization. RESTEasy version
> is 2.3.5_final.
>
> The behaviour is reproduced on a code as simple the one below. The
> temporary file is built before even looking up the address of the
> server. I don’t quite understand why a temporary file is necessary in
> the first place.
>
> Can others reproduce this problem or is it unique to my circumstances?
>
> Code:
>
> *import*java.io.FileInputStream;
>
> *import*java.io.FileNotFoundException;
>
> *import*java.io.InputStream;
>
> *import*javax.ws.rs.Consumes;
>
> *import*javax.ws.rs.PUT;
>
> *import*javax.ws.rs.Path;
>
> *import*org.jboss.resteasy.client.ProxyFactory;
>
> *import*org.junit.Test;
>
> *public**class*DummyTest {
>
> @Path("/dummy")
>
> *interface*DummyService {
>
> @PUT
>
> @Consumes("*/*")
>
>              String process( InputStream data );
>
>        }
>
> @Test
>
> *public**void*test() *throws*FileNotFoundException {
>
>              DummyService service = ProxyFactory./create/(
> DummyService.*class*, "http://nonexistent.domain/rest/";);
>
>              service.process( *new*FileInputStream( "<path to a large
> file>") );
>
>        }
>
> }
>
> -- *
> *Reino Ruusu
> Research Scientist
> VTT Technical Research Centre of Finland / Systems Engineering
>
> **********************************************************************
> E-mail sent through the Internet is not secure. Western Asset therefore
> recommends that you do not send any confidential or sensitive
> information to us via electronic mail, including social security
> numbers, account numbers, or personal identification numbers. Delivery,
> and or timely delivery of Internet mail is not guaranteed. Western Asset
> therefore recommends that you do not send time sensitive or
> action-oriented messages to us via electronic mail.
> **********************************************************************
>
>
> ------------------------------------------------------------------------------
> Try New Relic Now & We'll Send You this Cool Shirt
> New Relic is the only SaaS-based application performance monitoring service
> that delivers powerful full stack analytics. Optimize and monitor your
> browser, app, & servers with just a few lines of code. Try New Relic
> and get this awesome Nerd Life shirt! http://p.sf.net/sfu/newrelic_d2d_may
>
>
>
> _______________________________________________
> Resteasy-users mailing list
> Resteasy-users@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/resteasy-users
>

-- 
Bill Burke
JBoss, a division of Red Hat
http://bill.burkecentral.com

------------------------------------------------------------------------------
Try New Relic Now & We'll Send You this Cool Shirt
New Relic is the only SaaS-based application performance monitoring service 
that delivers powerful full stack analytics. Optimize and monitor your
browser, app, & servers with just a few lines of code. Try New Relic
and get this awesome Nerd Life shirt! http://p.sf.net/sfu/newrelic_d2d_may
_______________________________________________
Resteasy-users mailing list
Resteasy-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/resteasy-users

Reply via email to