异步Servlet带来的最大好处是HTTP push , 在该服务器中,服务器可以在选择时向客户端发送信息,而不是在客户端请求时将信息发送回客户端。在异步Servlet之前,这将需要长时间运行的HTTP连接,每个HTTP连接都会束缚服务器线程,这是非常低效的。这个新模型使服务器端处理与连接处理脱钩。 
异步的servlet
package com;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.AsyncContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
@RestController
public class AsyncController {
@GetMapping("/asyncTest")
public void test(HttpServletRequest request, HttpServletResponse response) {
long t1 = System.currentTimeMillis();
AsyncContext asyncContext = request.startAsync();
CompletableFuture.runAsync(() -> {
doSomeThing(asyncContext);
});
System.out.println("异步共用了:" + (System.currentTimeMillis() - t1));
}
public void doSomeThing(AsyncContext asyncContext) {
try {
TimeUnit.SECONDS.sleep(5);
asyncContext.getResponse().getWriter().append("异步OK");
} catch (InterruptedException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
asyncContext.complete();
}
}
同步的
package com;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
@RestController
public class SyncController {
@GetMapping("/syncTest")
public void test(HttpServletRequest request, HttpServletResponse response) {
long t1 = System.currentTimeMillis();
doSomeThing(response);
System.out.println("同步共用了:" + (System.currentTimeMillis() - t1));
}
public void doSomeThing(HttpServletResponse response) {
try {
TimeUnit.SECONDS.sleep(5);
response.getWriter().append("同步OK");
} catch (InterruptedException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
|