Я читаю книгу "RESTful Java с 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 поток веб-сервера (тот, который обрабатывает запрос) умирает и мы создаем еще один фоновый поток. Вся идея асинхронный сервер предназначен для уменьшения потоков в режиме ожидания. Эти примеры не уменьшая простоя. Один поток умирает, а другой рождается.
- Я думал, что создание неуправляемых потоков внутри контейнера - плохая идея. Мы должны использовать только управляемые потоки, используя утилиты concurrency в Java EE 7.
- Опять одна из идей, стоящих за асинхронными серверами, - масштабирование. Пример 3 не масштабируется, не так ли?