Large response - how to handle asynchronously
Don Park
donpark at docuverse.com
Sun Mar 28 10:06:54 EDT 2010
Łukasz,
It seems to me that you are trying to do too much within messageReceived.
I would just queue the request somewhere then handle it in another thread.
You can implement blocking behavior around that queue too.
Best,
- Don
On Mar 28, 2010, at 1:27 AM, Łukasz Osipiuk wrote:
> Hi!
>
> We really need this solved.
> If anybody had similar problem and have some thoughts on it we would
> really appreciate help.
>
> Best regards, Łukasz Osipiuk
>
> On Thu, Mar 25, 2010 at 16:14, Łukasz Osipiuk <lukasz at osipiuk.net> wrote:
>> Hi guys,
>>
>> We are implementing server application using Netty protocol framework
>> and we have problem implementing handling of large responses.
>> We will be handling many simultaneously connected clients.
>> In protocol we are implementing, responses to client requests can be
>> huge (lets assume that larger than server memory).
>> While handling request we have to read part of response data from
>> external storage - send it to client - wait until he receives the data
>> and continue with next part.
>>
>> We approached problem with following code in handler (simplified
>> version, no error handling and so on):
>>
>> @Override
>> public void messageReceived(ChannelHandlerContext ctx, MessageEvent
>> e) throws Exception {
>> XXXRequest req = (XXXRequest) e.getMessage();
>> writePartResponse(ctx, req);
>> }
>>
>> private void writePartResponse(final ChannelHandlerContext ctx,
>> final XXXRequest req) {
>> if (moreDataToBeRead(req)) {// anything more to be done?
>> XXXPartResponse resPart = readSomeData(req); // read some
>> data from storage
>> ChannelFuture f = ctx.getChannel().write(resPart);
>> f.addListener(new ChannelFutureListener() {
>> public void operationComplete(ChannelFuture f_) throws
>> Exception {
>> writePartResponse(ctx, req);
>> }
>> });
>> }
>> }
>>
>> Above approach does not work.
>>
>> Problem 1.
>>
>> While handling request we have to block other client's requests so
>> they are not handled simultaneously.
>> In above code when messageReceived() method terminates any pending
>> client requests are delivered to handler and handled even though
>> asynchronous handling of previous request might still be in progress.
>> We do not know how to block handling of any pending requests.
>>
>> Problem 2.
>>
>> I client is quick enough to read data from socket f.addListener
>> immediatelly triggers calling of futer.operationComplete in the same
>> thread.
>> This leads to StackOverflowError.
>> (btw. It appears that StackOverflowError it is not handled correctly
>> by netty in this place and application is not notified about it being
>> thrown - handling of request is just silently terminated).
>>
>> Any way to avoid above problems?
>> I guess the approach is broken - can anybody lead us how to implement
>> such (trivial one might think) behaviour?
>>
>> Best regards, Łukasz Osipiuk
>>
>>
>> --
>> --
>> Łukasz Osipiuk
>> mailto:lukasz at osipiuk.net
>>
>
>
>
> --
> --
> Łukasz Osipiuk
> mailto:lukasz at osipiuk.net
>
> _______________________________________________
> netty-users mailing list
> netty-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/netty-users
More information about the netty-users
mailing list