用servlet3.0 异步写了一个长链接, 发现 在runnable中的没有结束前, 其他请求线程都在等待中, 怎么阻塞了
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//此处 没有立即打印, 要等前一个请求完成后才有反应, 阻塞了 线程 System.out.println(req.getRequestURL()); AsyncContext ctx = req.startAsync(); ctx.setTimeout(14000); Executor exec = new Executor(ctx, this); ctx.addListener(new TListener(exec)); ctx.start(exec); }
public static class Executor implements Runnable {
AsyncContext context;
HttpServlet servlet;
boolean isComplete =false;
public Executor(AsyncContext context, HttpServlet servlet) {
this.context = context;
this.servlet = servlet;
}
public void run() {
HttpServletRequest req = (HttpServletRequest) context.getRequest();
HttpServletResponse res = (HttpServletResponse) context.getResponse();
String uri = req.getRequestURI();
String methodName = uri.substring(uri.lastIndexOf("/"));
Method method = methods.get(methodName);
if(method == null){
context.complete();
return;
}
String query = req.getParameter("query");
BaseDao service = null;
if (methodName.indexOf("Result") != -1) {
service = new TaskResultService();
}else{
service = new TaskService();
}
while (!isComplete) { //此处超时或获取数据会跳出
Object obj = ServletUtil.invoke(method, servlet, service, query);
try {
if (obj != null) {
ServletUtil.printJSON(res, ServletUtil.toJsonString(obj));
context.complete();
return;
}
Thread.sleep(3000);
} catch (Exception e) {
log.info("Executor:", e);
context.complete();
return;
}
}
}
}
测试发现, 浏览器器 两个请求 先后 上去, 只打印一个 URI, 超时才打印另一个
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
servlet3.0 异步本来是为了减少 线程池中的占用 时间, 给予新的线程做处理, 怎么我 写了以后直接把他给堵塞了, 要等待 新线程执行成功才行######准备结贴, google 浏览器 对同一个 url 地址的请求会出现 阻塞的情况, 如果使用刷新就看出来servlet 并没有 堵塞, 可以多个同时请求, 并等待自动回应