long_poll
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>HTTP Polling</title>
<meta http-equiv="content-type" content="text/html;charset=UTF-8" />
<script type="text/javascript" src="../js/jquery-1.8.1.min.js""></script>
<script type="text/javascript" src="../js/jquery.json-2.3.min.js"></script>
<script type="text/javascript">
jQuery(function($) {
function processEvents(events) {
if (events.length) {
$('#logs').append('<span style="color: blue;">[client] ' + events.length + ' events</span><br/>');
} else {
$('#logs').append('<span style="color: red;">[client] no event</span><br/>');
}
for (var i in events) {
$('#logs').append('<span>[event] ' + events[i] + '</span><br/>');
}
}
function long_polling() {
$.getJSON('../comet/poll', function(events) {
processEvents(events);
long_polling();
});
}
long_polling();
});
</script>
</head>
<body>
<div id="logs" style="font-family: monospace;">
</div>
</body>
</html>
Servlet3.0 WebServlet
import javax.servlet.AsyncContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import net.sf.json.JSONArray;
import java.io.IOException;
import java.util.Date;
import java.util.Queue;
import java.util.Random;
import java.util.concurrent.ConcurrentLinkedQueue;
@WebServlet(urlPatterns = { "/comet/poll" }, asyncSupported = true)
public final class ReverseAjaxPollServlet extends HttpServlet {
private static final long serialVersionUID = -440621084604367770L;
private final Queue<AsyncContext> asyncContexts = new ConcurrentLinkedQueue<AsyncContext>();
private final Random random = new Random();
private final Thread generator = new Thread("Event generator") {
@Override
public void run() {
while (!Thread.currentThread().isInterrupted()) {
try {
Thread.sleep(random.nextInt(5000)+1000);
if (asyncContexts.isEmpty()){
continue;
}
JSONArray array = new JSONArray();
array.add("At " + new Date());
String result = array.toString();
int size = asyncContexts.size();
for (int i=0; i<size; ++i){
AsyncContext asyncContext = asyncContexts.poll();
HttpServletResponse peer = (HttpServletResponse) asyncContext
.getResponse();
peer.getWriter().write(result);
peer.setStatus(HttpServletResponse.SC_OK);
asyncContext.complete();
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
} catch (Exception e) {
e.printStackTrace();
}
}
}
};
@Override
public void init() throws ServletException {
generator.start();
}
@Override
public void destroy() {
generator.interrupt();
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
resp.setContentType("application/json");
resp.setHeader("Cache-Control", "no-cache");
AsyncContext asyncContext = req.startAsync();
asyncContext.setTimeout(0);
asyncContexts.offer(asyncContext);
System.out.println(new Date());
}
}