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-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 >