tomcat-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Heath Gerhardt" <hgerha...@chartwelltechnology.com>
Subject RE: Comet not sending response under load
Date Thu, 20 Sep 2012 22:16:58 GMT
I forgot to mention my connector looks like

 

<Connector port="8080"
protocol="org.apache.coyote.http11.Http11NioProtocol" 

               connectionTimeout="20000" emptySessionPath="true"

               redirectPort="8443" />

 

And that the timeout is set during the read event. The docs say that the
timeout should only be set during the begin event but not why. 

 

From: Heath Gerhardt 
Sent: Thursday, September 20, 2012 3:28 PM
To: 'users@tomcat.apache.org'
Subject: Comet not sending response under load

 

Hello Everyone,

 

I am having an issue where tomcat 6.0.35 comet is not sending a response
when the host is under significant load. It is also sending the end
event which, as far as I understand, means the CometEvent is not being
closed. 

 

I am suspicious that this may be because the legacy code I am debugging
is using comet timeouts to handle rescheduling. When a request comes in
and there is no data immediately available our code sets
cometEvent.setTimeout(30000) and then attaches some attributes to the
event. 

 

I can log the response, it is there waiting to be sent, and the read
event which is triggering the response completes successfully. 

 

The problem only occurs when running on our prod and staging CentOS 5.4
but not on local CentOS 6.3 or Windows machines.

 

Any ideas on why the response and end event would be getting held up
under load?

 

Code below

 

Thank you,

Heath

 

public class MyCometProcessor extends HttpServlet implements
CometProcessor {

 

    @Override

    public void event(CometEvent cometEvent) throws IOException,
ServletException {

        HttpServletRequest request = cometEvent.getHttpServletRequest();

 

        try {

            if (cometEvent.getEventType() == CometEvent.EventType.BEGIN)
{

                                // do nothing

            }

            else if (cometEvent.getEventType() ==
CometEvent.EventType.READ) {

                new CometReadHandler(cometEvent).process();

            }

            else if (cometEvent.getEventType() ==
CometEvent.EventType.ERROR) {

                if (cometEvent.getEventSubType() ==
CometEvent.EventSubType.TIMEOUT) {

                    new CometTimeoutHandler(cometEvent).process();

                }

                cometEvent.close();

            }

            else if (cometEvent.getEventType() ==
CometEvent.EventType.END) {

                cometEvent.close();

            }

        } catch (Exception e) {

            try {

                cometEvent.close();

            } catch (Exception ignore) {}

            throw new ServletException(e);

        }

    }

}

 

 

public class CometReadHandler {

    private final CometEvent cometEvent;

 

    public CometReadHandler(CometEvent cometEvent) {

        if (cometEvent.getEventType() != CometEvent.EventType.READ) {

            throw new IllegalArgumentException(...);

        }

        this.cometEvent = cometEvent;

    }

 

    public void process() throws Exception {

        InputStream inStream;

        Element messageResponse;

        try {

            inStream =
cometEvent.getHttpServletRequest().getInputStream();

            messageResponse = generateMessage(inStream);

        } catch (Throwable thrown) {

                // log

            return;

        }

 

        if (messageResponse == null) {

            cometEvent.setTimeout(30000);

            cometEvent.getHttpServletRequest().setAttribute("key",
dataObject);

        } else {

            try {

                new MessageSender(cometEvent).send(messageResponse);

            } finally {

                try {

                    cometEvent.close();

                } catch (Exception ignore) {

                }

            }

        }

    }

}

 

 

public class CometTimeoutHandler {

    private final CometEvent cometEvent;

 

    public CometTimeoutHandler(CometEvent cometEvent) {

        if (cometEvent.getEventType() != CometEvent.EventType.END &&
cometEvent.getEventSubType() != CometEvent.EventSubType.TIMEOUT) {

            throw new IllegalArgumentException("");

        }

        this.cometEvent = cometEvent;

    }

    

    public void process() throws Exception {

                // generate message and send, message is generated and
logged and I see it in the logs

    }

}

 

public class MessageSender {

    private final CometEvent cometEvent;

 

    public MessageSender(CometEvent cometEvent) {

        this.cometEvent = cometEvent;

    }

 

    public void send(Element xmlResponse) throws IOException,
ServletException {

        cometEvent.getHttpServletResponse().setContentType("text/xml");

        PrintWriter writer =
cometEvent.getHttpServletResponse().getWriter();

       MessagingUtil.outputElement(xmlResponse, writer);

        writer.flush();

    }

}


______________________________________________________________________
This message, including any attachments, is confidential and contains information intended
only for the person(s) named above. Any other distribution, copying or disclosure is strictly
prohibited. If you are not the intended recipient or have received this message in error,
please notify us immediately by reply email and permanently delete the original transmission
from all of your systems and hard drives, including any attachments, without making a copy.
Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message