【发布时间】:2015-11-01 10:08:37
【问题描述】:
我正在阅读“带有 JAX-RS 2.0 的 RESTful Java”一书。我对异步 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 无法扩展,是吗?
【问题讨论】:
标签: java web-services rest asynchronous jax-rs