Using the NIO connector: protocol="org.apache.coyote.http11.Http11NioProtocol".
I'll add response.flushBuffer() and see if that helps.
The tomcat version I was testing against was current with svn as of
last Friday. I just updated and the only files that are new are:
catalina.policy
STATUS.txt
changelog.xml
Any ideas about the timeout setting or the comet error event without a subtype?
Thanks for your response!
Peter
On Jan 7, 2008 12:44 PM, Filip Hanik - Dev Lists <[EMAIL PROTECTED]> wrote:
> what connector are you using?
> I would try to use response.flushBuffer when you wanna flush it out (ie
> after you've written to and flushed your stream).
>
> also, there have been some bug fixes, that you can get from SVN, or wait
> for 6.0.16 to come out
>
> Filip
>
>
> Peter Warren wrote:
> > I have some comet questions. I'm using the tomcat 6.0.x trunk as of
> > last Friday.
> >
> > 1) My comet event timeout setting being honored. How come? I set the
> > timeout for 3 hours but a timeout event gets generated every 2
> > minutes. If I inspect the comet event for which the timeout is
> > triggered, I see a setting for the request attribute of:
> > org.apache.tomcat.comet.timeout=10800000.
> >
> > I set it as follows:
> >
> > public void event(CometEvent cometEvent) throws IOException,
> > ServletException {
> > ...
> > if (cometEvent.getEventType() == CometEvent.EventType.BEGIN) {
> > // COMET_TIMEOUT = 3 * 60 * 60 * 1000
> > cometEvent.setTimeout(TimingConstants.COMET_TIMEOUT);
> >
> > Do I need to set something else as well?
> >
> > 2) Occasionally I'm getting a comet event of type ERROR without any
> > subtype (i.e. not TIMEOUT, CLIENT_DISCONNECT, etc.). What does that
> > indicate? I don't see any errors in my catalina log.
> >
> > 3) Reading the response from a comet servlet fails for one of my
> > client machines. I wrote a simple test to check the problem. This
> > test succeeds for many other users. For the failing client, the
> > client request is received by the comet servlet, and the servlet's
> > response is written and flushed to the stream. The client then simply
> > waits indefinitely trying to read the response. The failing client is
> > a Windows XP machine. Could anyone shed some light on why this might
> > be happening, or give me some clues as to how to debug? Could it be a
> > firewall issue on the client end, a router issue on my end?
> >
> > The test is currently up at: http://www.seekspeak.com/test.html. It
> > tests: a http connection to a normal servlet, then a comet connection
> > to a comet servlet using httpurlconnection, then a comet connection to
> > a comet servlet using a socket. For the failing client, both comet
> > tests fail.
> >
> > Below is some of the test code for the raw socket test.
> >
> > Thanks for any help!
> >
> > Peter
> >
> > CLIENT
> > ------
> > private void testCometConnection() throws IOException {
> > ...
> > URL url = new URL("http://www.seekspeak.com/CometTest");
> > channel = new CometChannel(url);
> > Thread testThread = new Thread() {
> > public void run() {
> > try {
> > channel.send("test");
> > String received = channel.receive();
> > ...
> > }
> > } catch (IOException ioe) {
> > ioe.printStackTrace();
> > }
> > }
> > };
> > testThread.start();
> > ...
> > }
> >
> > private class CometChannel {
> >
> > private static final int INPUT_BUFFER_SIZE = 512;
> >
> > private static final int OUTPUT_BUFFER_SIZE = 512;
> >
> > private static final String DELIMITER = "\r\n";
> >
> > private URL url;
> >
> > private BufferedReader inputReader;
> >
> > private PrintWriter outputWriter;
> >
> > private Socket socket;
> >
> > public CometChannel(URL url) throws IOException {
> > this.url = url;
> > initConnection();
> > }
> >
> > private void initSocket() throws IOException {
> > int port = url.getPort();
> > port = (port < 0) ? url.getDefaultPort() : port;
> > try {
> > socket = new Socket(url.getHost(), port);
> > socket.setKeepAlive(true);
> > inputReader = new BufferedReader(new
> > InputStreamReader(socket.getInputStream()), INPUT_BUFFER_SIZE);
> > outputWriter = new PrintWriter(new BufferedWriter(new
> > OutputStreamWriter(socket.getOutputStream()),
> > OUTPUT_BUFFER_SIZE));
> > } catch (NoRouteToHostException nrthe) {
> > System.out.println("host: " + url.getHost());
> > nrthe.printStackTrace();
> > }
> > }
> >
> > private void initConnection() throws IOException {
> > initSocket();
> > sendHeaders();
> > }
> >
> > private void sendHeaders() {
> > String path = url.getPath();
> > StringBuffer outputBuffer = new StringBuffer();
> > outputBuffer.append("POST " + path + " HTTP/1.1" + DELIMITER);
> > outputBuffer.append("Host: " + url.getHost() + DELIMITER);
> > outputBuffer.append("User-Agent: CometTestApplet" + DELIMITER);
> > outputBuffer.append("Connection: keep-alive" + DELIMITER);
> > outputBuffer.append("Content-Type: text/plain" + DELIMITER);
> > outputBuffer.append("Transfer-Encoding: chunked" + DELIMITER);
> > outputBuffer.append(DELIMITER);
> > synchronized (outputWriter) {
> > outputWriter.print(outputBuffer.toString());
> > }
> > }
> >
> > public void send(String chunkData) throws IOException {
> > // chunk length field in hex
> > String hexChunkLength = Integer.toHexString(chunkData.length());
> >
> > StringBuffer outputBuffer = new StringBuffer();
> > outputBuffer.append(hexChunkLength);
> > outputBuffer.append(DELIMITER);
> > outputBuffer.append(chunkData);
> > outputBuffer.append(DELIMITER);
> > synchronized (outputWriter) {
> > outputWriter.print(outputBuffer.toString());
> > outputWriter.flush();
> > }
> > }
> >
> > private String readChunk() throws IOException {
> > StringBuffer inputBuffer = new StringBuffer();
> > String hexChunkSize = inputReader.readLine();
> > if (hexChunkSize != null) {
> > int chunkSize = Integer.parseInt(hexChunkSize, 16);
> > int charsRead = 0;
> >
> > char[] buf = new char[chunkSize];
> > do {
> > int n = inputReader.read(buf);
> > charsRead += n;
> > if (n > 0) {
> > inputBuffer.append(new String(buf, 0, n));
> > } else if (n < 0) {
> > // occurs when connection is closed, often in
> > response
> > // to http session timeout from server
> > throw new IOException("no bytes read");
> > }
> > } while (charsRead < chunkSize);
> > // extra \r\n sent after chunk - part of protocol
> > inputReader.readLine();
> > }
> > return inputBuffer.toString();
> > }
> >
> > public String receive() throws IOException {
> > readHeaders();
> > return readChunk();
> > }
> >
> > private void readHeaders() throws IOException {
> > String header;
> > while ((header = inputReader.readLine()) != null) {
> > System.out.println("header: " + header);
> > if (header.length() == 0) {
> > break;
> > }
> > }
> > }
> > ...
> > }
> >
> > SERVER
> > ------
> > public class CometTestServlet extends HttpServlet implements CometProcessor
> > {
> > private static final long serialVersionUID = 5472498184127924791L;
> >
> > public void event(CometEvent cometEvent) throws IOException,
> > ServletException {
> > HttpServletRequest request = cometEvent.getHttpServletRequest();
> > HttpSession httpSession = request.getSession(true);
> > if (cometEvent.getEventType() == CometEvent.EventType.BEGIN) {
> > cometEvent.setTimeout(3 * 60 * 60 * 1000); // 3 hours
> > // tell the http session not to timeout - will invalidate it on
> > // error or end
> > httpSession.setMaxInactiveInterval(-1);
> > } else if (cometEvent.getEventType() == CometEvent.EventType.ERROR)
> > {
> > handleErrorEvent(cometEvent, httpSession);
> > } else if (cometEvent.getEventType() == CometEvent.EventType.END) {
> > close(cometEvent, httpSession);
> > } else if (cometEvent.getEventType() == CometEvent.EventType.READ) {
> > handleReadEvent(cometEvent);
> > }
> > }
> >
> > protected void handleErrorEvent(CometEvent cometEvent, HttpSession
> > httpSession) throws IOException {
> > if (cometEvent.getEventSubType() !=
> > CometEvent.EventSubType.TIMEOUT) {
> > close(cometEvent, httpSession);
> > }
> > }
> >
> > private void close(CometEvent cometEvent, HttpSession httpSession)
> > throws IOException {
> > cometEvent.close();
> > httpSession.invalidate();
> > }
> >
> > private void handleReadEvent(CometEvent cometEvent) throws
> > IOException, ServletException {
> > ServerCometChannel talker = new ServerCometChannel(cometEvent);
> > respond(talker);
> > }
> >
> > private void respond(ServerCometChannel channel) throws IOException {
> > String clientMessage = channel.receive();
> >
> > if (clientMessage != null && clientMessage.length() > 0) {
> > channel.send("comet succeeded");
> > }
> > }
> >
> > private class ServerCometChannel {
> >
> > private static final int OUTPUT_BUFFER_SIZE = 512;
> >
> > private CometEvent cometEvent;
> >
> > private InputStream inputStream;
> >
> > private PrintWriter outputWriter;
> >
> > public ServerCometChannel(CometEvent cometEvent) throws
> > IOException, ServletException {
> > this.cometEvent = cometEvent;
> > inputStream =
> > cometEvent.getHttpServletRequest().getInputStream();
> > OutputStream outputStream =
> > cometEvent.getHttpServletResponse().getOutputStream();
> > this.outputWriter = new PrintWriter(new BufferedWriter(new
> > OutputStreamWriter(outputStream),
> > OUTPUT_BUFFER_SIZE));
> > }
> >
> > private String receive() throws IOException {
> > StringBuffer buffer = new StringBuffer();
> > byte[] buf = new byte[512];
> > while (inputStream.available() > 0) {
> > int n = inputStream.read(buf);
> > if (n > 0) {
> > buffer.append(new String(buf, 0, n));
> > }
> > }
> > return buffer.toString();
> > }
> >
> > public void send(String msg) {
> > synchronized (cometEvent.getHttpServletResponse()) {
> > outputWriter.print(msg);
> > outputWriter.flush();
> > }
> > }
> >
> > public void close() throws IOException {
> > inputStream.close();
> > outputWriter.close();
> > }
> > }
> >
> > ---------------------------------------------------------------------
> > To start a new topic, e-mail: [email protected]
> > To unsubscribe, e-mail: [EMAIL PROTECTED]
> > For additional commands, e-mail: [EMAIL PROTECTED]
> >
> >
> >
> >
>
>
> ---------------------------------------------------------------------
> To start a new topic, e-mail: [email protected]
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
>
>
---------------------------------------------------------------------
To start a new topic, e-mail: [email protected]
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]