EA Async mengimplementasikan metode Async-Await di JVM. Hal ini memungkinkan pemrogram untuk menulis kode asinkron secara berurutan.
Ini sangat terinspirasi oleh Async-Await di .NET CLR, lihat Pemrograman Asynchronous dengan Async dan Await untuk informasi lebih lanjut.
EA Async harus digunakan untuk menulis kode asinkron non-pemblokiran yang banyak menggunakan CompletableFutures atau CompletionStage. Ini meningkatkan skalabilitas dengan membebaskan thread pekerja sementara kode Anda menunggu proses lainnya; Dan meningkatkan produktivitas dengan membuat kode asinkron menjadi lebih sederhana dan lebih mudah dibaca.
Proyek ini dikembangkan oleh Electronic Arts dan dilisensikan di bawah Lisensi 3-Klausul BSD.
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 );
}
}
Dalam contoh ini Bank.decrement
mengembalikan CompletableFuture<Boolean>
dan Inventory.giveItem
mengembalikan CompletableFuture<String>
EA Async menulis ulang panggilan ke Async.await
membuat metode Anda tidak memblokir.
Metode tersebut terlihat memblokir tetapi sebenarnya diubah menjadi metode asinkron yang menggunakan CompletableFutures untuk melanjutkan eksekusi saat hasil perantara tiba.
Ini adalah tampilan contoh pertama tanpa EA Async. Ini agak kurang mudah dibaca.
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 );
});
}
}
Ini adalah contoh kecil... Sebuah metode dengan beberapa CompletableFutures bisa terlihat sangat berbelit-belit.
EA Async mengabstraksi kompleksitas dari CompletableFutures.
Jadi Anda menyukai CompletableFutures? Coba ubah metode ini untuk hanya menggunakan CompletableFutures tanpa pernah memblokir (jadi jangan bergabung):
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 );
}
}
}
Mengerti? Kirimkan kepada kami. Mungkin terlihat jelek...
EA Async saat ini mendukung JDK 8-10.
Ia bekerja dengan Java dan Scala dan harus bekerja dengan sebagian besar bahasa JVM. Satu-satunya persyaratan untuk menggunakan EA Async adalah harus digunakan hanya di dalam metode yang mengembalikan CompletableFuture
, CompletionStage
, atau subkelas 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'
Mulai aplikasi Anda dengan parameter JVM tambahan: -javaagent:ea-async-1.2.3.jar
java -javaagent:ea-async-1.2.3.jar -cp your_claspath YourMainClass args...
Disarankan untuk menambahkan ini sebagai opsi default ke peluncur di proyek IntelliJ yang menggunakan ea-async.
Di kelas utama Anda atau sedini mungkin, hubungi setidaknya sekali:
Async.init();
Asalkan JVM Anda mengaktifkan kemampuannya, ini akan memulai agen instrumentasi runtime. Jika Anda lupa menjalankan fungsi ini, panggilan pertama ke await
akan menginisialisasi sistem (dan mencetak peringatan).
Ini adalah solusi untuk pengujian dan pengembangan, dengan jumlah konfigurasi paling sedikit. Ini mungkin mengganggu debugging JVM. Alternatif ini hadir sebagai cadangan.
EA-async-1.2.3.jar adalah jar runnable yang dapat melakukan pra-instrumen pada file Anda.
Penggunaan:
java -cp YOUR_PROJECT_CLASSPATH -jar ea-async-1.2.3.jar classDirectory
Contoh:
java -cp guava.jar ; commons-lang.jar -jar ea-async-1.2.3.jar target/classes
Setelah itu semua file di target/kelas akan diinstrumentasi. Tidak akan ada referensi ke Async.await
dan Async.init
yang tersisa di kelas tersebut.
Gunakan plugin ea-async-maven. Ini akan melengkapi kelas Anda dalam waktu kompilasi dan menghapus semua referensi ke Async.await
dan Async.init()
.
Dengan instrumentasi waktu pembangunan, pengguna proyek Anda tidak perlu memiliki EA Async di jalur kelasnya kecuali mereka juga memilih untuk menggunakannya. Artinya, EA Async tidak perlu menjadi ketergantungan transitif .
Ini adalah pilihan terbaik untuk perpustakaan dan proyek pakar.
< 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 >