异步 JAX-RS 的用途是什么
我正在读“RESTful Java with JAX-RS 2.0”一书。我对异步 JAX-RS 完全感到困惑,所以我在一个中提出所有问题。这本书是这样写异步服务器的:
@Path("/customers")
public class CustomerResource {
@GET
@Path("{id}")
@Produces(MediaType.APPLICATION_XML)
public void getCustomer(@Suspended final AsyncResponse asyncResponse,
@Context final Request request,
@PathParam(value = "id") final int id) {
new Thread() {
@Override
public void run() {
asyncResponse.resume(Response.ok(new Customer(id)).build());
}
}.start();
}
}
Netbeans 创建异步服务器,如下所示:
@Path("/customers")
public class CustomerResource {
private final ExecutorService executorService = java.util.concurrent.Executors.newCachedThreadPool();
@GET
@Path("{id}")
@Produces(MediaType.APPLICATION_XML)
public void getCustomer(@Suspended final AsyncResponse asyncResponse,
@Context final Request request,
@PathParam(value = "id") final int id) {
executorService.submit(new Runnable() {
@Override
public void run() {
doGetCustomer(id);
asyncResponse.resume(javax.ws.rs.core.Response.ok().build());
}
});
}
private void doGetCustomer(@PathParam(value = "id") final int id) {
}
}
那些不创建后台线程的那些使用一些锁定方法来存储响应对象以进行进一步处理。此示例用于向客户发送股票报价:
@Path("qoute/RHT")
public class RHTQuoteResource {
protected List<AsyncResponse> responses;
@GET
@Produces("text/plain")
public void getQuote(@Suspended AsyncResponse response) {
synchronized (responses) {
responses.add(response);
}
}
}
responses
对象将与一些后台作业共享,并在准备就绪时向所有客户端发送报价。
我的问题:
- 在示例 1 和 2 中,Web 服务器线程(处理请求的线程)死亡,我们创建另一个后台线程。异步服务器背后的整个想法是减少空闲线程。这些示例不会减少空闲线程。一个线程死亡,另一个线程诞生。
- 我认为在容器内创建非托管线程是一个坏主意。我们应该只在 Java EE 7 中使用并发实用程序的托管线程。
- 同样,异步服务器背后的想法之一是扩展。示例 3 不缩放,不是吗?