EA Async는 JVM에서 Async-Await 메서드를 구현합니다. 이를 통해 프로그래머는 순차적 방식으로 비동기 코드를 작성할 수 있습니다.
이는 .NET CLR의 Async-Await에서 크게 영감을 받았습니다. 자세한 내용은 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...
ea-async를 사용하는 IntelliJ 프로젝트의 런처에 이를 기본 옵션으로 추가하는 것이 좋습니다.
메인 수업에서 또는 가능한 한 일찍 적어도 한 번은 전화하십시오.
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-plugin을 사용하세요. 컴파일 시간에 클래스를 계측하고 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 >