Created
October 2, 2016 18:59
-
-
Save john77eipe/4588015ed371c240dbb166d0370d1122 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
package async; | |
import java.io.IOException; | |
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; | |
@WebServlet(urlPatterns = "/async0", asyncSupported = true) | |
public class Async0 extends HttpServlet { | |
private static final long serialVersionUID = 1L; | |
@Override | |
protected void service(final HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException { | |
Boolean status = (Boolean) request.getAttribute("dispatch"); | |
println("status attr: " + status); | |
if (Boolean.TRUE == status) { | |
println("Received dispatch, completing on the worker thread."); | |
response.getWriter().write("Dispatch received. Worker thread completed \n"); | |
response.getWriter().flush(); | |
} else { | |
response.getWriter().write("Before starting job \n"); | |
response.getWriter().flush(); | |
final AsyncContext actx = request.startAsync(); | |
actx.setTimeout(Long.MAX_VALUE); | |
Thread thread = new Thread(new HeavyTask(actx)); | |
thread.start(); | |
request.setAttribute("dispatch", Boolean.TRUE); | |
response.getWriter().write("After starting job \n"); | |
response.getWriter().flush(); | |
} | |
} | |
class HeavyTask implements Runnable { | |
AsyncContext actx; | |
HeavyTask(AsyncContext actx) { | |
this.actx = actx; | |
} | |
@Override | |
public void run() { | |
try { | |
Thread.currentThread().setName("Job-Thread-" + actx.getRequest().getParameter("job")); | |
for (int i = 0; i < 7; i++) { | |
actx.getResponse().getWriter().write("Doing work (" + i + ")\n"); | |
Thread.sleep(1000); | |
println("work " + i + " completed"); | |
} | |
println("Job finished now dispatching..."); | |
actx.dispatch(); | |
} catch (InterruptedException e) { | |
e.printStackTrace(); | |
} catch (IllegalStateException e) { | |
e.printStackTrace(); | |
} catch (IOException e) { | |
e.printStackTrace(); | |
} | |
} | |
} | |
public static void println(String output) { | |
System.out.println("[" + Thread.currentThread().getName() + "]" + output); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment