EA Async реализует методы Async-Await в JVM. Это позволяет программистам писать асинхронный код последовательно.
Он во многом основан на Async-Await в .NET CLR. Дополнительные сведения см. в разделе Асинхронное программирование с помощью Async и Await.
EA Async следует использовать для написания неблокирующего асинхронного кода, который интенсивно использует CompletableFutures или CompletionStage. Это улучшает масштабируемость, освобождая рабочие потоки, пока ваш код ожидает других процессов; И повышает производительность, делая асинхронный код более простым и читабельным.
Этот проект был разработан Electronic Arts и распространяется по лицензии BSD 3-Clause License.
import static com . ea . async . Async . await ;
import static java . util . concurrent . CompletableFuture . completedFuture ;
public class Store
{
public CompletableFuture < Boolean > buyItem ( String itemTypeId , int cost )
{
if (! await ( bank . decrement ( cost ))) {
return completedFuture ( false );
}
await ( inventory . giveItem ( itemTypeId ));
return completedFuture ( true );
}
}
В этом примере Bank.decrement
возвращает CompletableFuture<Boolean>
, а Inventory.giveItem
возвращает CompletableFuture<String>
EA Async перезаписывает вызовы Async.await
делая ваши методы неблокирующими.
Методы выглядят блокирующими, но на самом деле преобразуются в асинхронные методы, которые используют CompletableFutures для продолжения выполнения по мере поступления промежуточных результатов.
Вот как выглядит первый пример без EA Async. Это немного менее читабельно.
import static java . util . concurrent . CompletableFuture . completedFuture ;
public class Store
{
public CompletableFuture < Boolean > buyItem ( String itemTypeId , int cost )
{
return bank . decrement ( cost )
. thenCompose ( result -> {
if (! result ) {
return completedFuture ( false );
}
return inventory . giveItem ( itemTypeId ). thenApply ( res -> true );
});
}
}
Это небольшой пример... Метод с еще несколькими CompletableFutures может выглядеть очень запутанно.
EA Async абстрагирует сложность CompletableFutures.
Итак, вам нравится CompletableFutures? Попробуйте преобразовать этот метод, чтобы использовать только CompletableFutures без блокировки (то есть без присоединения):
import static com . ea . async . Async . await ;
import static java . util . concurrent . CompletableFuture . completedFuture ;
public class Store
{
public CompletableFuture < Boolean > buyItem ( String itemTypeId , int cost )
{
if (! await ( bank . decrement ( cost ))) {
return completedFuture ( false );
}
try {
await ( inventory . giveItem ( itemTypeId ));
return completedFuture ( true );
} catch ( Exception ex ) {
await ( bank . refund ( cost ));
throw new AppException ( ex );
}
}
}
Понятно? Отправьте его нам. Наверное, это выглядит некрасиво...
EA Async в настоящее время поддерживает JDK 8–10.
Он работает с Java и Scala и должен работать с большинством языков JVM. Единственное требование для использования EA Async — его следует использовать только внутри методов, которые возвращают CompletableFuture
, CompletionStage
или подклассы CompletableFuture
.
< dependency >
< groupId >com.ea.async</ groupId >
< artifactId >ea-async</ artifactId >
< version >1.2.3</ version >
</ dependency >
'com.ea.async:ea-async:1.2.3'
Запустите приложение с дополнительным параметром JVM: -javaagent:ea-async-1.2.3.jar
java -javaagent:ea-async-1.2.3.jar -cp your_claspath YourMainClass args...
Рекомендуется добавить эту опцию в качестве опции по умолчанию для средств запуска в проектах IntelliJ, использующих ea-async.
На основном занятии или как можно раньше позвоните хотя бы один раз:
Async.init();
При условии, что на вашей JVM включена такая возможность, запустится агент инструментирования среды выполнения. Если вы забудете вызвать эту функцию, первый вызов await
инициализирует систему (и выведет предупреждение).
Это решение для тестирования и разработки, имеет наименьшее количество настроек. Это может помешать отладке JVM. Эта альтернатива присутствует как запасной вариант.
ea-async-1.2.3.jar — это работоспособный jar-файл, который может предварительно инструментировать ваши файлы.
Использование:
java -cp YOUR_PROJECT_CLASSPATH -jar ea-async-1.2.3.jar classDirectory
Пример:
java -cp guava.jar ; commons-lang.jar -jar ea-async-1.2.3.jar target/classes
После этого все файлы в целевых/классах будут инструментированы. В этих классах не останется ссылок на Async.await
и Async.init
.
Используйте плагин ea-async-maven. Он будет инструментировать ваши классы во время компиляции и удалять все ссылки на Async.await
и Async.init()
.
Благодаря инструментированию времени сборки пользователям вашего проекта не понадобится иметь EA Async в своем пути к классам, если они также не захотят его использовать. Это означает, что EA Async не обязательно должен быть транзитивной зависимостью .
Это лучший вариант для библиотек и проектов maven.
< build >
< plugins >
< plugin >
< groupId >com.ea.async</ groupId >
< artifactId >ea-async-maven-plugin</ artifactId >
< version >1.2.3</ version >
< executions >
< execution >
< goals >
< goal >instrument</ goal >
< goal >instrument-test</ goal >
</ goals >
</ execution >
</ executions >
</ plugin >
</ plugins >
</ build >