cxf-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Sergey Beryozkin <sberyoz...@gmail.com>
Subject Re: Streaming API
Date Tue, 12 Jun 2012 15:09:03 GMT
Hi
On 11/06/12 22:26, Daniel Kulp wrote:
>
> I went ahead and implemented this on trunk and 2.6.x.   It would be great if
> someone could try the JAX-RS streaming stuff with tomorrows snapshot to make
> sure it really solves the problem.
>
Dan, thanks for taking care of it, my test shows the problem is fixed, 
here is the code:

@Produces(MediaType.TEXT_PLAIN)
@Path("/stream")
public StreamingOutput stream() {
            StreamingOutput so = new StreamingOutput() {

             public void write(final OutputStream output) throws 
IOException, WebApplicationException {
                                     int count = 0;
                                     while (count < 5) {
                                                    count++;
                                                    final String m = 
"Message " + count + "\r\n";
 
output.write(m.getBytes("UTF-8"));
                                                     output.flush();

                                                     Thread.sleep(1000);

                                     }

                             }

            };

            return so;
     }

and the curl trace:

GET /bookstore/stream HTTP/1.1
 > User-Agent: curl/7.21.6 (x86_64-pc-linux-gnu) libcurl/7.21.6 
OpenSSL/1.0.0e zlib/1.2.3.4 libidn/1.22 librtmp/2.3
 > Host: localhost:8080
 > Accept: */*
 >
< HTTP/1.1 200 OK
< Content-Type: text/plain
< Date: Tue, 12 Jun 2012 15:04:14 GMT
< Transfer-Encoding: chunked
< Server: Jetty(7.5.4.v20111024)
<
Message 1
Message 2
Message 3
Message 4
Message 5
* Connection #0 to host localhost left intact
* Closing connection #0

the code:

Torsten, please try the snapshots with your own tests

Thanks, Sergey

> Dan
>
>
> On Monday, June 11, 2012 11:33:28 AM Daniel Kulp wrote:
>> On Monday, June 11, 2012 01:34:51 PM Sergey Beryozkin wrote:
>>> On 09/06/12 09:44, Thorsten Höger wrote:
>>>> I tried using the StreamingOutput and it did not work either.
>>>> But I stepped through the code and found an interesting piece in the
>>>> CXF
>>>> HTTP Transport:
>>>> org.apache.cxf.transport.http.AbstractHTTPDestination.WrappedOutputStr
>>>> e
>>>> am>
>>>>
>>>>           public void flush() throws IOException {
>>>>
>>>>               //ignore until we close
>>>>               // or we'll force chunking and cause all kinds of network
>>>>               packets
>>>>
>>>>           }
>>>
>>> We can introduce a property which can be used to let the flush() to
>>> delegate, I'll experiment with your code a bit later and update you
>>
>> Well, I was thinking something slightly different...  Basically, we block
>> that flush there as using JAXB databinding with the XMLStreamWriters
>> causes some in-opportune flushes resulting in extra chunks and network
>> packets. Thus, My THOUGHT would be to remove that line from
>> AbstractHTTPDestination and instead move it into the StaxOutInterceptor
>> where we create the XMLStreamWriter.   Basically, take the original
>> OutputStream, wrap it with a new output stream that traps the flush, then
>> create XMLStreamWriter.    For code paths that don't go thought the
>> StaxOutInterceptor, they would be un- affected.
>>
>>
>> Dan
>>
>>> Cheers, Sergey
>>>
>>>> This is part of the class the StreamingOutput gets as parameter in its
>>>> write method.
>>>>
>>>> Regards,
>>>> Thorsten
>>>>
>>>> Am 08.06.2012 19:39, schrieb Daniel Kulp:
>>>>> Well, I know why it's NOT working.....   With the PipedIn/Out things,
>>>>> CXF
>>>>> pretty much sits in a loop reading from the InputStream and writing
>>>>> to
>>>>> the HTTP OutputStream.   Since there is no way to know that you
>>>>> requested a "flush" in there, that loop just loops until the close at
>>>>> which point it would flush and close the output.
>>>>>
>>>>> You may need to wait for Sergey to be back next week, but you COULD
>>>>> look at returning a "StreamingOutput" object where you could get the
>>>>> raw OutputStream and do the periodic writes as needed.     With my
>>>>> few
>>>>> minutes of research, that's what I came up with.  :-)   Sergey may
>>>>> have better ideas.
>>>>>
>>>>> Dan
>>>>>
>>>>> On Friday, June 08, 2012 01:47:07 PM Thorsten Höger wrote:
>>>>>> Hi,
>>>>>>
>>>>>> I'm currently devloping a REST API for our software and I need
>>>>>> streaming
>>>>>> functionality.
>>>>>>
>>>>>> I'm using CXF with Jetty and wiring with Spring.
>>>>>>
>>>>>> I tried it with the attached code, but if I do a curl on the address
>>>>>> ti
>>>>>> blocks until Message 5 and the prints all lines.
>>>>>>
>>>>>> I expected it to print each line on its own with 1 second break.
>>>>>>
>>>>>> Can anybody give me a hint what I am doing wrong?
>>>>>>
>>>>>> Regards and thanks
>>>>>>
>>>>>> Thorsten


-- 
Sergey Beryozkin

Talend Community Coders
http://coders.talend.com/

Blog: http://sberyozkin.blogspot.com

Mime
View raw message