Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package jettyserver;
- import java.io.IOException;
- import javax.servlet.AsyncContext;
- import javax.servlet.ReadListener;
- import javax.servlet.ServletException;
- import javax.servlet.ServletInputStream;
- import javax.servlet.ServletOutputStream;
- import javax.servlet.WriteListener;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import config.SocketConfigurationConstants;
- import org.eclipse.jetty.server.Request;
- import org.eclipse.jetty.server.Server;
- import org.eclipse.jetty.server.ServerConnector;
- import org.eclipse.jetty.server.handler.AbstractHandler;
- public class AsyncJettyServer
- {
- public static void main(String[] args) throws Exception
- {
- Server server = new Server();
- server.setHandler(new AsyncHttpHandler());
- ServerConnector httpConnector = new ServerConnector(server);
- httpConnector.setPort(SocketConfigurationConstants.HTTP_SERVER_PORT);
- server.addConnector(httpConnector);
- server.start();
- server.join();
- }
- static class AsyncHttpHandler extends AbstractHandler
- {
- @Override
- public void handle(String target, Request baseRequest, HttpServletRequest request, final HttpServletResponse response) throws IOException, ServletException
- {
- if (response.isCommitted() || baseRequest.isHandled())
- {
- return;
- }
- baseRequest.setHandled(true);
- final AsyncContext asyncContext = request.startAsync(request, response);
- final ServletInputStream input = asyncContext.getRequest().getInputStream();
- final ServletOutputStream output = asyncContext.getResponse().getOutputStream();
- asyncContext.setTimeout(0);
- response.setContentType(request.getContentType());
- Echoer echoer = new Echoer(asyncContext);
- input.setReadListener(echoer);
- output.setWriteListener(echoer);
- }
- }
- private static class Echoer implements ReadListener, WriteListener
- {
- private final byte[] buffer = new byte[1024 * 4];
- private final AsyncContext asyncContext;
- private final ServletInputStream input;
- private final ServletOutputStream output;
- private boolean complete;
- private Echoer(AsyncContext asyncContext) throws IOException
- {
- this.asyncContext = asyncContext;
- this.input = asyncContext.getRequest().getInputStream();
- this.output = asyncContext.getResponse().getOutputStream();
- }
- @Override
- public void onDataAvailable() throws IOException
- {
- while (input.isReady())
- {
- int read = input.read(buffer);
- output.write(buffer, 0, read);
- if (!output.isReady())
- {
- return;
- }
- }
- if (input.isFinished())
- {
- complete = true;
- asyncContext.complete();
- }
- }
- @Override
- public void onAllDataRead() throws IOException
- {
- }
- @Override
- public void onWritePossible() throws IOException
- {
- if (input.isFinished())
- {
- if (!complete)
- {
- asyncContext.complete();
- }
- }
- else
- {
- onDataAvailable();
- }
- }
- @Override
- public void onError(Throwable failure)
- {
- failure.printStackTrace();
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment