/*******************************************************************************
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright (c) 2013,2014 by Peter Pilgrim, Addiscombe, Surrey, XeNoNiQUe UK
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU GPL v3.0
* which accompanies this distribution, and is available at:
* http://www.gnu.org/licenses/gpl-3.0.txt
*
* Developers:
* Peter Pilgrim -- design, development and implementation
* -- Blog: http://www.xenonique.co.uk/blog/
* -- Twitter: @peter_pilgrim
*
* Contributors:
*
*******************************************************************************/
package je7hb.servlets.simple;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintStream;
import java.util.StringTokenizer;
/**
* The type AsyncWriterServlet
*
* @author Peter Pilgrim
*/
@WebServlet(name = "AsyncWriterServlet",
urlPatterns = { "/writer"}, asyncSupported = true )
public class AsyncWriterServlet extends HttpServlet {
private static final String LOREM_IPSUM =
"Lorem ipsum dolor sit amet, consectetur adipisicing " +
"elit, sed do eiusmod tempor incididunt ut labore et " +
"dolore magna aliqua. Ut enim ad minim veniam, quis " +
"nostrud exercitation ullamco laboris nisi ut " +
"aliquip ex ea commodo consequat. Duis aute irure " +
"dolor in reprehenderit in voluptate velit esse " +
"cillum dolore eu fugiat nulla pariatur. Excepteur " +
"sint occaecat cupidatat non proident, sunt in " +
"culpa qui officia deserunt mollit anim id " +
"est laborum.";
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
System.out.printf("init() called on %s\n",
getClass().getSimpleName());
}
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException {
System.out.printf("doGet() called on %s\n",
getClass().getSimpleName());
processResponse(request, response);
}
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException {
System.out.printf("doPost() called on %s\n",
getClass().getSimpleName());
processResponse(request, response);
}
private void processResponse(HttpServletRequest request,
HttpServletResponse response)
throws IOException {
System.out.printf("processRequest() called %s" +
" on thread [%s]\n",
getClass().getSimpleName(),
Thread.currentThread().getName());
AsyncContext context = request.startAsync();
ServletOutputStream output = response.getOutputStream();
output.setWriteListener(
new AsyncWriteListener( output, context));
}
private class AsyncWriteListener implements WriteListener {
private ServletOutputStream output;
private AsyncContext context;
private static final String LOREM_IPSUM =
"Lorem ipsum dolor sit amet, consectetur adipisicing " +
"elit, sed do eiusmod tempor incididunt ut labore et " +
"dolore magna aliqua. Ut enim ad minim veniam, quis " +
"nostrud exercitation ullamco laboris nisi ut " +
"aliquip ex ea commodo consequat. Duis aute irure " +
"dolor in reprehenderit in voluptate velit esse " +
"cillum dolore eu fugiat nulla pariatur. Excepteur " +
"sint occaecat cupidatat non proident, sunt in " +
"culpa qui officia deserunt mollit anim id " +
"est laborum.";
private AsyncWriteListener(ServletOutputStream output,
AsyncContext context) {
this.output = output;
this.context = context;
System.out.printf("thread [%s] AsyncWriteListener()\n ",
Thread.currentThread().getName());
}
@Override
public void onWritePossible() {
System.out.printf("thread [%s] onWritePossible() " +
"Sending data ...\n",
Thread.currentThread().getName());
StringTokenizer stk =
new StringTokenizer(LOREM_IPSUM," \t,.");
PrintStream ps = new PrintStream(output);
try {
while ( output.isReady() && stk.hasMoreTokens() ) {
if ( stk.hasMoreTokens()) {
ps.println( stk.nextToken() );
ps.flush();
Thread.sleep(200);
}
}
ps.println("End of server *push*");
ps.flush();
ps.close();
System.out.printf("thread [%s] Finished sending ...\n",
Thread.currentThread().getName());
}
catch (Exception e) {
e.printStackTrace(System.err);
}
finally {
context.complete();
}
}
@Override
public void onError(Throwable t) {
System.out.printf("thread [%s] Error occurred=%s\n",
Thread.currentThread().getName(),
t.getMessage());
context.complete();
}
}
}