turns out that if the request is comet, the recycling of the
input/output filter is not happening.
I have fixed this,
you can try the tomcat-coyote.jar from
http://people.apache.org/~fhanik/tomcat/tomcat-coyote.jar
Filip
Filip Hanik - Dev Lists wrote:
> hi Peter,
> thanks for the example, I am able to reproduce this error, let me take
> a look and see why it is happening,
>
> Filip
>
> Peter Warren wrote:
>> How do you send multiple requests to the same comet servlet?
>>
>> Sending multiple chunks of a single request is fine. My problem occurs
>> after the client ends the chunked transaction by sending "0CRLFCRLF"
>> to the
>> server. The comet servlet correctly registers the END event.
>>
>> But then the client subsequently tries to initiate a new chunked
>> request by
>> sending new http headers and a new chunk. The comet servlet receives a
>> BEGIN event, immediately followed by an END event. A READ event is
>> never
>> generated for the new chunk. No ERROR events are registered either.
>>
>> Sequence:
>> 1st request
>> BEGIN
>> READ
>> END
>>
>> 2nd request
>> BEGIN
>> END - why an END event and not a READ?
>>
>> Below are my test client and test comet servlet. Any thoughts on
>> what I'm
>> doing wrong?
>>
>> (I apologize in advance if this is a lack of understanding of http on my
>> part. I have looked at the specs and tried to follow the rules but
>> am still
>> running into problems.)
>>
>> Thanks,
>> Peter
>>
>> -----
>>
>>
>> import java.io.IOException;
>> import java.io.InputStream;
>>
>> import javax.servlet.ServletException;
>> import javax.servlet.http.HttpServlet;
>> import javax.servlet.http.HttpServletRequest;
>> import javax.servlet.http.HttpServletResponse;
>>
>> import org.apache.catalina.CometEvent;
>> import org.apache.catalina.CometProcessor;
>>
>> 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();
>> HttpServletResponse response =
>> cometEvent.getHttpServletResponse();
>> // don't want timeout events
>> cometEvent.setTimeout(1000000);
>> if (cometEvent.getEventType() == CometEvent.EventType.BEGIN) {
>> log("Begin for session: " +
>> request.getSession(true).getId());
>> } else if (cometEvent.getEventType() ==
>> CometEvent.EventType.ERROR)
>> {
>> log("Error for session: " +
>> request.getSession(true).getId() +
>> ", " + cometEvent.getEventSubType());
>> cometEvent.close();
>> } else if (cometEvent.getEventType() ==
>> CometEvent.EventType.END) {
>> log("End for session: " + request.getSession(true).getId());
>> cometEvent.close();
>> } else if (cometEvent.getEventType() ==
>> CometEvent.EventType.READ) {
>> log("Read for session: " +
>> request.getSession(true).getId());
>> respond(request, response);
>> }
>> }
>>
>> private void respond(HttpServletRequest request, HttpServletResponse
>> response) throws IOException {
>> String clientMessage = read(request);
>>
>> if (clientMessage != null && clientMessage.length() > 0) {
>> response.getWriter().print(clientMessage);
>> response.getWriter().flush();
>> }
>> }
>>
>> private String read(HttpServletRequest request) throws IOException {
>> InputStream is = request.getInputStream();
>> StringBuffer inputBuffer = new StringBuffer();
>> byte[] buf = new byte[512];
>> while (is.available() > 0) {
>> int n = is.read(buf); // can throw an IOException
>> if (n > 0) {
>> inputBuffer.append(new String(buf, 0, n));
>> log("Read " + n + " bytes: " + new String(buf, 0, n)
>> + " for
>> session: "
>> + request.getSession(true).getId());
>> } else if (n < 0) {
>> log("comet read error");
>> }
>> }
>> return inputBuffer.toString();
>> }
>> }
>>
>>
>> -----
>>
>>
>> import java.io.IOException;
>> import java.io.InputStream;
>> import java.io.OutputStream;
>> import java.net.Socket;
>>
>> public class CometTestClient1 {
>>
>> public static final String ENCODING = "ISO-8859-1";
>>
>> private Socket socket;
>>
>> private OutputStream out;
>>
>> public static void main(String[] args) throws Exception {
>> CometTestClient1 test = new CometTestClient1();
>> test.test();
>> }
>>
>> public CometTestClient1() throws IOException {
>> initConnection();
>> }
>>
>> private void initConnection() throws IOException {
>> socket = new Socket("127.0.0.1", 80);
>> socket.setKeepAlive(true);
>> out = socket.getOutputStream();
>> sendHeaders();
>> }
>>
>> private void sendHeaders() throws IOException {
>> println("GET /CometTest HTTP/1.1");
>> println("Host: 127.0.0.1");
>> println("User-Agent: test");
>> println("Transfer-Encoding: chunked");
>> println("Connection: keep-alive");
>> }
>>
>> private void test() throws IOException {
>> sendChunkedMessage();
>> try {
>> Thread.sleep(60000);
>> } catch (InterruptedException ie) {
>> ie.printStackTrace();
>> }
>> // doesn't seem to matter if I create a new socket connection or not
>> //initConnection();
>> sendHeaders();
>> sendChunkedMessage();
>>
>> }
>>
>> private void sendChunkedMessage() throws IOException {
>> println();
>> println("10");
>> print("test data test 1");
>> out.flush();
>>
>> String line = read();
>> System.out.println(line);
>>
>> println();
>> println("0");
>> println();
>> out.flush();
>>
>> line = read();
>> System.out.println(line);
>> }
>>
>> private void print(String chars) throws IOException {
>> out.write(chars.getBytes(ENCODING));
>> }
>>
>> private void println(String chars) throws IOException {
>> out.write((chars + "\r\n").getBytes(ENCODING));
>> }
>>
>> private void println() throws IOException {
>> out.write(("\r\n").getBytes(ENCODING));
>> }
>>
>> private String read() throws IOException {
>> InputStream in = socket.getInputStream();
>> StringBuffer inputBuffer = new StringBuffer();
>> byte[] buf = new byte[512];
>> do {
>> int n = in.read(buf); // can throw an IOException
>> if (n > 0) {
>> inputBuffer.append(new String(buf, 0, n));
>> } else if (n < 0) {
>> return ("read error");
>> }
>> } while (in.available() > 0);
>> return inputBuffer.toString();
>> }
>> }
>>
>>
>> -----
>>
>>
>> HTTP/1.1 200 OK
>> Server: Apache-Coyote/1.1
>> Set-Cookie: JSESSIONID=775B71AFC0066AA45224A4F00309D101; Path=/
>> Transfer-Encoding: chunked
>> Date: Tue, 14 Aug 2007 20:00:49 GMT
>>
>> 10
>> test data test 1
>>
>> 0
>>
>>
>> HTTP/1.1 200 OK
>> Server: Apache-Coyote/1.1
>> Set-Cookie: JSESSIONID=BF0C8B7A0D27CDCA6A285F9C4C598613; Path=/
>> Content-Length: 0
>> Date: Tue, 14 Aug 2007 20:00:49 GMT
>>
>>
>> read error
>>
>>
>> -----
>>
>> connector configuration for tomcat 6.0.14 on windows xp:
>> > protocol="org.apache.coyote.http11.Http11NioProtocol"
>> maxThreads="150" connectionTimeout="120000" keepAliveTimeout="300000"
>> maxKeepAliveRequests="-1" socket.soKeepAlive="true"
>> acceptorThreadCount="2"
>> redirectPort="8443" />
>>
>> -----
>>
>> Catalina log registering begin, read, and end events for initial
>> request,
>> followed by begin and end events for subsequent request:
>>
>> Aug 14, 2007 1:02:37 PM org.apache.catalina.core.ApplicationContext log
>> INFO: CometTest: Begin for session: 910EA1A41AB07465D61585930564AFD0
>> Aug 14, 2007 1:02:37 PM org.apache.catalina.core.ApplicationContext log
>> INFO: CometTest: Read for session: 910EA1A41AB07465D61585930564AFD0
>> Aug 14, 2007 1:02:37 PM org.apache.catalina.core.ApplicationContext log
>> INFO: CometTest: End for session: 910EA1A41AB07465D61585930564AFD0
>> Aug 14, 2007 1:02:37 PM org.apache.catalina.core.ApplicationContext log
>> INFO: CometTest: Begin for session: 22A5A802D4A201A024939BE724A1F530
>> Aug 14, 2007 1:02:37 PM org.apache.catalina.core.ApplicationContext log
>> INFO: CometTest: End for session: 22A5A802D4A201A024939BE724A1F530
>>
>>
>> ------------------------------------------------------------------------
>>
>> No virus found in this incoming message.
>> Checked by AVG Free Edition. Version: 7.5.476 / Virus Database:
>> 269.11.17/951 - Release Date: 8/13/2007 10:15 AM
>>
>
>
> ---------------------------------------------------------------------
> To start a new topic, e-mail: users@tomcat.apache.org
> To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
> For additional commands, e-mail: users-help@tomcat.apache.org
>
>
>
---------------------------------------------------------------------
To start a new topic, e-mail: users@tomcat.apache.org
To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
For additional commands, e-mail: users-help@tomcat.apache.org