تطبق EA Async أساليب Async-Await في JVM. يسمح للمبرمجين بكتابة تعليمات برمجية غير متزامنة بطريقة تسلسلية.
إنها مستوحاة بشكل كبير من Async-Await على .NET CLR، راجع البرمجة غير المتزامنة مع Async وAwait لمزيد من المعلومات.
يجب استخدام EA Async لكتابة تعليمات برمجية غير متزامنة غير محظورة والتي تستخدم بشكل مكثف CompletableFutures أو CompletionStage. يعمل على تحسين قابلية التوسع عن طريق تحرير سلاسل العمليات بينما تنتظر التعليمات البرمجية الخاصة بك عمليات أخرى؛ ويحسن الإنتاجية من خلال جعل التعليمات البرمجية غير المتزامنة أبسط وأكثر قابلية للقراءة.
تم تطوير هذا المشروع بواسطة Electronic Arts وهو مرخص بموجب ترخيص BSD المكون من 3 فقرات.
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 );
});
}
}
هذا مثال صغير... يمكن أن تبدو الطريقة التي تحتوي على عدد قليل من العقود الآجلة الكاملة معقدة للغاية.
تتخلص 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 عبارة عن وعاء قابل للتشغيل يمكنه تجهيز ملفاتك مسبقًا.
الاستخدام:
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 لا يحتاج إلى أن يكون تبعية متعدية .
هذا هو الخيار الأفضل للمكتبات والمشاريع المخضرمة.
< 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 >