| [//]: # " Copyright (c) 2015, 2020 Oracle and/or its affiliates. All rights reserved. " | |
| [//]: # " " | |
| [//]: # " This program and the accompanying materials are made available under the " | |
| [//]: # " terms of the Eclipse Distribution License v. 1.0, which is available at " | |
| [//]: # " http://www.eclipse.org/org/documents/edl-v10.php. " | |
| [//]: # " " | |
| [//]: # " SPDX-License-Identifier: BSD-3-Clause " | |
| Server Asynchronous Managed Example | |
| =================================== | |
| This example demonstrates JAX-RS 2.0 server-side non-blocking API using **ManagedAsync** annotation. | |
| The full description how to create an asynchronous resource can be found in Jersey User Guide, chapter | |
| [Asynchronous Services and Clients](https://eclipse-ee4j.github.io/jersey.github.io/documentation/latest/async.html). | |
| Indicates that the resource method to which the annotation has been applied | |
| * should be executed on a separate thread managed by an internal Jersey | |
| The goal of the sample is to demonstrate that with limited I/O processing threads | |
| on the server the synchronous execution of a long-running task may lead to resource | |
| starvation caused by I/O processing threads being blocked by the long-running | |
| operation, unable to serve new incoming requests. | |
| OTOH, when the same long-running operation is executed asynchronously, the I/O | |
| threads do not need to block while waiting for the long-running operation to finish | |
| and the overall throughput of the system is greatly increased. | |
| - Look at the another example how to create a non-blocking API without **ManagedAsync** | |
| annotation <https://github.com/jersey/jersey/tree/master/examples/server-async> | |
| which also shown the way how to provide an immediate response for a client | |
| Contents | |
| -------- | |
| The mapping of the URI path space is presented in the following table: | |
| URI path | Resource class | HTTP methods | |
| --------------------------------| --------------------------| -------------- | |
| **_chat_** | ChatResource | POST | |
| **_chat_** | ChatResource | GET | |
| **_managedasync/longrunning_** | BlockingPostChatResource | POST | |
| Sample Response | |
| --------------- | |
| This section shortly describes what really happens during the calls in this chat example. | |
| We can start with POST request: | |
| ``` | |
| curl -v -X POST http://localhost:8080/base/chat -H "Content-Type: application/json" -d '{ | |
| "author": "Anonymous Author", | |
| "message": "Secret Message" | |
| }' | |
| ``` | |
| We can notice that we haven't got any response yet. The called method is annotated **@ManagedAsync** | |
| which means that the I/O thread delegates a method processing to another Thread-Pool and is ready | |
| to accept another incoming request. But the processing is still stop. Why? **AsyncResponse** was added | |
| to the blocking queue and now it's waiting for GET call which will take the response and will finish the processing | |
| of the preceding call. | |
| ``` | |
| curl -v -X GET http://localhost:8080/base/chat | |
| ``` | |
| Running the Example | |
| ------------------- | |
| Run the example as follows: | |
| > mvn clean compile exec:java | |
| This deploys the example using [Grizzly](https://projects.eclipse.org/projects/ee4j.grizzly) container. |