Thank you very much. That indeed seem to solve the issue.

Am 25.03.14 14:24, schrieb Joakim Erdfelt:
A few things to address ...

Don't put HttpServletResponse and PrintWriter as field members.
Keep in mind that you have 1 instance and multiple requests.

Don't call baseRequest.setHandled(true) till you are done handling the request.
Don't forget to close your writer.

Using the try-with-resources pattern that might make this easier for you (as PrintWriter is an AutoCloseable resource)

try(PrintWriter writer = response.getWriter())
{
   // your logic on what content to respond with.
   writer.println("Hello");
} finally {
 baseRequest.setHandled(true)
}

Under Jetty, you can have multiple handlers work with the same response.getWriter(), merely ending the handler, or setting the baseRequest.setHandled(true) is not sufficient to let jetty know that the response is done. If you don't want to close the PrintWriter, at least flush it. (but know that an unclosed Writer will result in Jetty issuing the response content as chunked) (Note: the Handler behavior in this regard is different than the Servlet behavior)

--
Joakim Erdfelt <joa...@intalio.com <mailto:joa...@intalio.com>>
webtide.com <http://www.webtide.com/> - intalio.com/jetty <http://intalio.com/jetty>
Expert advice, services and support from from the Jetty & CometD experts
eclipse.org/jetty <http://eclipse.org/jetty/> - cometd.org <http://cometd.org/>


On Tue, Mar 25, 2014 at 1:17 AM, Enrico Kern <k...@clavain.com <mailto:k...@clavain.com>> wrote:

    Hello,

    i try to create a simple java application with jetty 9 embedded
    and one handler. The application receives status polls every few
    seconds, but some requests can take up to 20 seconds on the server
    to process.

    I figured out that sometimes the longer taking requests return a
    empty body in the response. This only happens if other requests
    are served by the jetty aswell. So i created a little dummy
    application and have the same behavior here. Im pretty new to
    jetty and just cant figure out what i do wrong.  Maybe someone can
    give me a hint.

    The problem is easy to replicate using then curl in one window:

    #!/bin/bash
    while(true); do
            curl localhost:44999
            sleep 1
    done

    which is the short request every second. And the long one which
    will wait 2 seconds in the handler (in the real application some
    command is executed here and the handler waits for it to return)

    #!/bin/bash
    while(true); do
            curl -i 127.0.0.1:44999/MEEEH/whyunotwork
    <http://127.0.0.1:44999/MEEEH/whyunotwork>
            sleep 1
    done

    the second curl loop will only return content if the first curl
    run is stopped. Headers are ok. Just the writer.println content is
    missing.  Im pretty sure i do something wrong here.

    Thats how i start the server:


             // Jetty
              Server server = new Server(44000);
              server.setHandler(new CheckJettyHandler());
              System.out.println("Starting Jetty on Port 44000");
              server.start();
              server.join();

    and the handler:

    package jettytest;


    import java.io.IOException;
    import java.io.PrintWriter;
    import java.lang.reflect.Modifier;
    import java.util.*;
    import java.util.logging.Level;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import org.apache.log4j.Logger;
    import org.eclipse.jetty.server.Request;
    import org.eclipse.jetty.server.handler.AbstractHandler;

    /**
     *
     * @author teeesting
     */
    public class CheckJettyHandler extends AbstractHandler {
        Logger logger = Logger.getRootLogger();
        private HttpServletResponse response;
        private PrintWriter writer;

        public void handle(String target,Request
    baseRequest,HttpServletRequest request,HttpServletResponse p_response)
            throws IOException, ServletException
        {

            if(!target.equals("/favicon.ico"))
            {
    logger.info <http://logger.info>("Request from
    ["+baseRequest.getRemoteAddr()+"] : " + target);
            }
            response = p_response;
            response.setContentType("text/html;charset=utf-8");
            response.setHeader("Server", "Blabla Test ");
            response.setHeader("Access-Control-Allow-Origin", "*");
            response.setCharacterEncoding("utf-8");
            writer = response.getWriter();

            baseRequest.setHandled(true);

            List l_lTargets = new ArrayList();
            StringTokenizer st = new StringTokenizer(target,"/");
            while (st.hasMoreTokens()) {
                String l_strToken = st.nextToken();
                l_lTargets.add(l_strToken);
                //response.getWriter().println(st.nextToken());
            }

            // multi request?
            if(l_lTargets.size() > 1)
            {
               try {
                    Thread.sleep(2000);
                } catch (InterruptedException ex) {
    
java.util.logging.Logger.getLogger(CheckJettyHandler.class.getName()).log(Level.SEVERE,
    null, ex);
                }
               writer.println("Hello");
            }
            else
            {
               // single requests
               response.setStatus(HttpServletResponse.SC_FORBIDDEN);
               writer.println("invalid authorisation key");
            }

        }

-- [Clavain Technologies GbR]

    Gesellschafter: Enrico Kern, Robin Elster
    k...@clavain.com <mailto:k...@clavain.com>
    www.clavain.com <http://www.clavain.com>

    Heerstraße 366
    13593 Berlin
    GERMANY

    PHONE: +49 30 89398336 <tel:%2B49%2030%2089398336>

    _______________________________________________
    jetty-users mailing list
    jetty-users@eclipse.org <mailto:jetty-users@eclipse.org>
    https://dev.eclipse.org/mailman/listinfo/jetty-users




_______________________________________________
jetty-users mailing list
jetty-users@eclipse.org
https://dev.eclipse.org/mailman/listinfo/jetty-users


--
[Clavain Technologies GbR]

Gesellschafter: Enrico Kern, Robin Elster
k...@clavain.com
www.clavain.com

Heerstraße 366
13593 Berlin
GERMANY

PHONE: +49 30 89398336

_______________________________________________
jetty-users mailing list
jetty-users@eclipse.org
https://dev.eclipse.org/mailman/listinfo/jetty-users

Reply via email to