Guest User

Untitled

a guest
Sep 16th, 2014
303
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.68 KB | None | 0 0
  1. package jettyserver;
  2.  
  3. import java.io.IOException;
  4.  
  5. import javax.servlet.AsyncContext;
  6. import javax.servlet.ReadListener;
  7. import javax.servlet.ServletException;
  8. import javax.servlet.ServletInputStream;
  9. import javax.servlet.ServletOutputStream;
  10. import javax.servlet.WriteListener;
  11. import javax.servlet.http.HttpServletRequest;
  12. import javax.servlet.http.HttpServletResponse;
  13.  
  14. import config.SocketConfigurationConstants;
  15. import org.eclipse.jetty.server.Request;
  16. import org.eclipse.jetty.server.Server;
  17. import org.eclipse.jetty.server.ServerConnector;
  18. import org.eclipse.jetty.server.handler.AbstractHandler;
  19.  
  20. public class AsyncJettyServer
  21. {
  22.  
  23.     public static void main(String[] args) throws Exception
  24.     {
  25.         Server server = new Server();
  26.         server.setHandler(new AsyncHttpHandler());
  27.         ServerConnector httpConnector = new ServerConnector(server);
  28.         httpConnector.setPort(SocketConfigurationConstants.HTTP_SERVER_PORT);
  29.         server.addConnector(httpConnector);
  30.         server.start();
  31.         server.join();
  32.     }
  33.  
  34.     static class AsyncHttpHandler extends AbstractHandler
  35.     {
  36.  
  37.         @Override
  38.         public void handle(String target, Request baseRequest, HttpServletRequest request, final HttpServletResponse response) throws IOException, ServletException
  39.         {
  40.             if (response.isCommitted() || baseRequest.isHandled())
  41.             {
  42.                 return;
  43.             }
  44.  
  45.             baseRequest.setHandled(true);
  46.             final AsyncContext asyncContext = request.startAsync(request, response);
  47.             final ServletInputStream input = asyncContext.getRequest().getInputStream();
  48.             final ServletOutputStream output = asyncContext.getResponse().getOutputStream();
  49.             asyncContext.setTimeout(0);
  50.  
  51.             response.setContentType(request.getContentType());
  52.             Echoer echoer = new Echoer(asyncContext);
  53.             input.setReadListener(echoer);
  54.             output.setWriteListener(echoer);
  55.         }
  56.     }
  57.  
  58.     private static class Echoer implements ReadListener, WriteListener
  59.     {
  60.  
  61.         private final byte[] buffer = new byte[1024 * 4];
  62.         private final AsyncContext asyncContext;
  63.         private final ServletInputStream input;
  64.         private final ServletOutputStream output;
  65.         private boolean complete;
  66.  
  67.         private Echoer(AsyncContext asyncContext) throws IOException
  68.         {
  69.             this.asyncContext = asyncContext;
  70.             this.input = asyncContext.getRequest().getInputStream();
  71.             this.output = asyncContext.getResponse().getOutputStream();
  72.         }
  73.  
  74.         @Override
  75.         public void onDataAvailable() throws IOException
  76.         {
  77.             while (input.isReady())
  78.             {
  79.                 int read = input.read(buffer);
  80.                 output.write(buffer, 0, read);
  81.                 if (!output.isReady())
  82.                 {
  83.                     return;
  84.                 }
  85.             }
  86.             if (input.isFinished())
  87.             {
  88.                 complete = true;
  89.                 asyncContext.complete();
  90.             }
  91.         }
  92.  
  93.         @Override
  94.         public void onAllDataRead() throws IOException
  95.         {
  96.         }
  97.  
  98.         @Override
  99.         public void onWritePossible() throws IOException
  100.         {
  101.             if (input.isFinished())
  102.             {
  103.                 if (!complete)
  104.                 {
  105.                     asyncContext.complete();
  106.                 }
  107.             }
  108.             else
  109.             {
  110.                 onDataAvailable();
  111.             }
  112.         }
  113.  
  114.         @Override
  115.         public void onError(Throwable failure)
  116.         {
  117.             failure.printStackTrace();
  118.         }
  119.     }
  120. }
Advertisement
Add Comment
Please, Sign In to add comment