Hi,
Sorry about the essays. :-) I will try to keep it shorter.
What I'm doing is closing the *output stream* of the response from the
server side application asynchronously.
Since this is outside the event() method, I do not have any reference to
a CometEvent instance.
I don't understand why the client does not get an immediate -1 (EOF) on
the read() as soon as I do this. The socket itself does not need to be
closed, but the output stream close should flush the output stream and
call shutdownOutput() on the underlying socket.
At the moment I have no way of asynchronously ending a response. Is it
the case that there *is* no way to do this with the current API? Or
should I go about it differently?
Regards,
Sebastiaan
Filip Hanik - Dev Lists wrote:
Correct, an asynchronous close doesn't go all the way down to the IO
layer, it just marks the request closed.
remember event.close doesn't mean TCP.socket.close, it means that this
event/request sequence is done
There are still many enhancements to be done to the Comet API, such as
non blocking reads/writes and others, feel free to gather up your
thoughts in a bulleted type email instead of the essays, they are a
little hard to read :)
Filip
Sebastiaan van Erk wrote:
Hi,
The reason I get the exceptions on the Tomcat server side seems to be
because I close the socket on the client at the same time I try to
close it on the server, causing two unsynchronized closes on the
OutputStream. I don't really know what to synchronize on though,
since I don't have an event (the close is done as a result of a
server side event and not a Comet event); the other close is done
deep inside of Tomcat. The only thing that the two have in common
could be the request itself or the outputstream, but I don't know if
Tomcat does any synchronization on these objects.
One way to avoid this simultaneous close would seem to be this: my
server application calls close on the OutputStream of the response,
my client application reads the EOF (-1) and then closes the socket,
causing an END event on the server side, in which I do any necessary
cleanup actions.
The problem is, when I try this approach, it takes my client many
seconds (>30) to receive the EOF, instead of getting it immediately.
That is why I was wondering what the correct way is to end a
request/response outside of a Comet event (as a result of an
application event). Even better would be if I could somehow trigger
the END event on the server to finish the request and close the
socket, so I don't have to rely on the client to play nice.
BTW, I'm using the subversion version of tomcat, synched with
subversion late yesterday evening.
Regards,
Sebastiaan
Praveen Balaji wrote:
I see the same problem with my client too. However, I don't see the
issue when I use a client using Jakarta HTTP client. I'm still looking
into this. Any help will, of course be welcome and delightfully
devoured.
This is not really the same bug report, but something to think about
when you're working with events. Also, it may have a clue I'm missing.
http://issues.apache.org/bugzilla/show_bug.cgi?id=42198
Also, check with the trunk to make sure you're able to reproduce your
defect.
Praveen
-----Original Message-----
From: Sebastiaan van Erk [mailto:[EMAIL PROTECTED] Sent:
Thursday, April 26, 2007 2:07 PM
To: Tomcat Users List
Subject: how to close a comet request outside of an event?
Hi,
I the following Comet question; due to a server event (not a comet
event), I want to write some data to a client request and finish the
request. Currently I write the data and then call
OutputStream.close() on the response output stream. This seems to
work, except that it takes a long time before I get an END event for
that request. On the client this causes the EOF to the request input
stream to arrive very late. This is a problem, because both the
server and client are handling so many requests that I run out of
file descriptors and get the following exception (on the server):
Apr 26, 2007 10:28:23 AM
org.apache.tomcat.util.net.NioEndpoint$Acceptor
run
SEVERE: Socket accept failed
java.io.IOException: Too many open files
at sun.nio.ch.ServerSocketChannelImpl.accept0(Native Method)
at
sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:1
45)
at
org.apache.tomcat.util.net.NioEndpoint$Acceptor.run(NioEndpoint.java:117
7)
at java.lang.Thread.run(Thread.java:619)
Note: I'm running the client and server on the same machine, but the
client does not get any "Too many open files" exceptions (it does
not get any exceptions at all), so I'm assuming the process limit of
tomcat is reached, suggesting that tomcat is not closing the request
sockets until the END event...
If I close the request on the client side before I get the EOF (-1)
in a
read I don't get the Too many open files problem and generally get
the END event immediately on the server side, but I sporadically get
NullPointerExceptions and AsynchronousCloseExceptions and
ClosedChannelExceptions on the server side in the
OutputStream.close() method. I figure the proper method is for the
client tp wait for the server to say "the request is done" (by
waiting for the EOF) before closing thesocket, but how do I make
sure it gets closed immediately on the server side if I'm not in a
comet event?
Regards,
Sebastiaan
---------------------------------------------------------------------
To start a new topic, e-mail: users@tomcat.apache.org
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
---------------------------------------------------------------------
To start a new topic, e-mail: users@tomcat.apache.org
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
---------------------------------------------------------------------
To start a new topic, e-mail: users@tomcat.apache.org
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
---------------------------------------------------------------------
To start a new topic, e-mail: users@tomcat.apache.org
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
---------------------------------------------------------------------
To start a new topic, e-mail: users@tomcat.apache.org
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]