Created
July 5, 2010 05:50
-
-
Save StephanSchmidt/464045 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class BigPipeServlet extends HttpServlet { | |
private static ExecutorService executor = Executors.newFixedThreadPool(500, new ThreadFactory() { | |
public Thread newThread(Runnable r) { | |
Thread t = new Thread(r); | |
t.setName("Service Thread "+ t.getId()); | |
t.setDaemon(true); | |
return t; | |
} | |
}); | |
protected void service(HttpServletRequest req, final HttpServletResponse resp) throws ServletException, IOException { | |
final PrintWriter writer = resp.getWriter(); | |
String doctype = "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"\n" + | |
" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">"; | |
String head = "<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"de\" lang=\"de\"> \n" + | |
"<head> \n" + | |
"<meta http-equiv=\"Content-type\" content=\"text/html; charset=utf-8\" /> \n" + | |
"<meta http-equiv=\"Content-language\" content=\"de\" />\n"; | |
writer.write(doctype); | |
writer.write(head); | |
writer.write("<script type=\"text/javascript\">function arrived(id,text) { var b=document.getElementById(id); b.innerHTML = text; }</script>"); | |
writer.write("</HEAD><BODY><div>Progressive Loading"); | |
content(writer, "content1", "content2", "content3", "content4", "content5", "content6"); | |
writer.write("</div>\n"); | |
final Random random = new Random(); | |
List<Callable<Boolean>> tasks = new ArrayList<Callable<Boolean>>(); | |
for (int i = 0; i < 6; i++) { | |
final int id = i + 1; | |
tasks.add(new Callable<Boolean>() { | |
public Boolean call() { | |
try { | |
// One service call is nasty and takes 50sec | |
if (id == 3) { | |
Thread.sleep(50000); | |
} else { | |
Thread.sleep(random.nextInt(2000)); | |
} | |
pagelet(writer, "content" + id, "Wohooo" + id); | |
} catch (InterruptedException e) { | |
return false; | |
} | |
return true; | |
} | |
}); | |
} | |
try { | |
executor.invokeAll(tasks, 1500, TimeUnit.MILLISECONDS); | |
} catch (InterruptedException ignored) { | |
// ignored | |
} | |
writer.write("</BODY></HTML>"); | |
} | |
private void content(PrintWriter writer, String... contentIds) { | |
for (String id : contentIds) { | |
writer.write("<div id=\"" + id + "\">-</div>\n"); | |
} | |
} | |
private void pagelet(PrintWriter writer, String id, String content) { | |
if (writer.checkError()) return; | |
writer.write("<script>" + | |
"arrived(\"" + id + "\", \"" + content + "\");" + | |
"</script>\n"); | |
writer.flush(); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment