Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Aplikasi HelloWorldWorkflowAsync
Terkadang, sebaiknya alur kerja melakukan tugas tertentu secara lokal alih-alih menggunakan aktivitas. Namun, tugas alur kerja sering melibatkan pengolahan nilai-nilai yang diwakili oleh objek Promise<T>
. Jika Anda meneruskan objek Promise<T>
ke metode alur kerja sinkron, metode mengeksekusi segera tetapi tidak dapat mengakses nilai objek Promise<T>
objek siap. Anda bisa melakukan polling Promise<T>.isReady
sampai kembali true
, tapi itu tidak efisien dan metode mungkin memblokir untuk waktu yang lama. Pendekatan yang lebih baik adalah dengan menggunakan asynchronous method (metode asinkron).
Metode asinkron diimplementasikan seperti metode standar—sering sebagai anggota kelas implementasi alur kerja—dan berjalan dalam konteks implementasi alur kerja. Anda menetapkan sebagai metode asinkron dengan menerapkan anotasi @Asynchronous
, yang mengarahkan kerangka kerja untuk memperlakukannya seperti suatu aktivitas.
-
Ketika implementasi alur kerja memanggil metode asinkron, alur kerja kembali dengan segera. Metode asinkron biasanya mengembalikan objek
Promise<T>
, yang telah siap ketika metode selesai. -
Jika Anda melewati metode asinkron satu atau lebih objek
Promise<T>
, metode menunda eksekusi sampai semua objek masukan siap. Sebuah metode asinkron karena itu dapat mengakses input nilaiPromise<T>
tanpa mempertaruhkan pengecualian.
catatan
Karena cara bahwa AWS Flow Framework untuk Java mengeksekusi alur kerja, metode asinkron biasanya mengeksekusi beberapa kali, sehingga Anda harus menggunakannya hanya untuk tugas-tugas cepat dengan overhead rendah. Anda harus menggunakan aktivitas untuk melakukan tugas-tugas yang panjang seperti komputasi large. Untuk detail selengkapnya, lihat AWS Flow FrameworkKonsep Basic: Eksekusi Terdistribusi.
Topik ini adalah panduan dari HelloWorldWorkflowAsync, versi modifikasi dari HelloWorldWorkflow yang menggantikan salah satu aktivitas dengan metode asinkron. Untuk menerapkan aplikasi, membuat salinan paket helloWorld.HelloWorldWorkflow di direktori proyek Anda dan namakan helloWorld.HelloWorldWorkflowAsync.
catatan
Topik ini didasarkan pada konsep dan file yang disajikan di topik Aplikasi HelloWorld dan HelloWorldWorkflow Aplikasi. Biasakan diri Anda dengan file dan konsep yang disajikan dalam topik tersebut sebelum melanjutkan.
Bagian berikut menjelaskan cara mengubah kode HelloWorldWorkflow asli untuk menggunakan metode asinkron.
Pelaksanaan Aktivitas HelloWorldWorkflowAsync
HelloWorldWorkflowAsync mengimplementasikan antarmuka pekerja aktivitas di GreeterActivities
, sebagai berikut:
import com.amazonaws.services.simpleworkflow.flow.annotations.Activities; import com.amazonaws.services.simpleworkflow.flow.annotations.ActivityRegistrationOptions; @Activities(version="2.0") @ActivityRegistrationOptions(defaultTaskScheduleToStartTimeoutSeconds = 300, defaultTaskStartToCloseTimeoutSeconds = 10) public interface GreeterActivities { public String getName(); public void say(String what); }
Antarmuka ini mirip dengan yang digunakan oleh HelloWorldWorkflow, dengan pengecualian berikut:
-
Ini menghilangkan aktivitas
getGreeting
; tugas yang sekarang ditangani dengan metode asinkron. -
Nomor versi diatur ke 2.0. Setelah Anda mendaftarkan antarmuka aktivitas dengan Amazon SWF, Anda tidak dapat memodifikasinya kecuali Anda mengubah nomor versi.
Implementasi metode aktivitas yang tersisa identik dengan HelloWorldWorkflow. Hapus saja getGreeting
dari GreeterActivitiesImpl
.
Implementasi Alur Kerja HelloWorldWorkflowAsync
HelloWorldWorkflowAsync mendefinisikan antarmuka alur kerja sebagai berikut:
import com.amazonaws.services.simpleworkflow.flow.annotations.Execute; import com.amazonaws.services.simpleworkflow.flow.annotations.Workflow; import com.amazonaws.services.simpleworkflow.flow.annotations.WorkflowRegistrationOptions; @Workflow @WorkflowRegistrationOptions(defaultExecutionStartToCloseTimeoutSeconds = 3600) public interface GreeterWorkflow { @Execute(version = "2.0") public void greet(); }
Antarmuka identik dengan HelloWorldWorkflow selain dari nomor versi baru. Seperti aktivitas, jika Anda ingin mengubah alur kerja terdaftar, Anda harus mengubah versinya.
HelloWorldWorkflowAsync mengimplementasikan alur kerja sebagai berikut:
import com.amazonaws.services.simpleworkflow.flow.annotations.Asynchronous; import com.amazonaws.services.simpleworkflow.flow.core.Promise; public class GreeterWorkflowImpl implements GreeterWorkflow { private GreeterActivitiesClient operations = new GreeterActivitiesClientImpl(); @Override public void greet() { Promise<String> name = operations.getName(); Promise<String> greeting = getGreeting(name); operations.say(greeting); } @Asynchronous private Promise<String> getGreeting(Promise<String> name) { String returnString = "Hello " + name.get() + "!"; return Promise.asPromise(returnString); } }
HelloWorldWorkflowAsync menggantikan aktivitas getGreeting
dengan metode asinkron getGreeting
tetapi metode greet
bekerja dalam banyak cara yang sama:
-
Eksekusi aktivitas
getName
, yang segera mengembalikan objekPromise<String>
,name
, yang mewakili nama. -
Panggil metode asinkron
getGreeting
dan meneruskan objekname
.getGreeting
dengan segera mengembalikan objekPromise<String>
,greeting
, yang mewakili ucapan. -
Eksekusi aktivitas
say
dan meneruskan objekgreeting
. -
Saat
getName
lengkap,name
telah siap dangetGreeting
menggunakan nilainya untuk membangun ucapan. -
Saat
getGreeting
lengkap,greeting
telah siap dansay
mencetak string ke konsol tersebut.
Perbedaannya adalah bahwa, daripada memanggil klien aktivitas untuk mengeksekusi aktivitas getGreeting
, menyapa panggilan metode getGreeting
asinkron. Hasil bersih adalah sama, tetapi metode getGreeting
bekerja agak berbeda dari aktivitas getGreeting
.
-
Pekerja alur kerja menggunakan semantik fungsi panggilan standar untuk mengeksekusi
getGreeting
. Namun, eksekusi asinkron aktivitas dimediasi oleh Amazon SWF. -
getGreeting
menjalankan di proses implementasi alur kerja. -
getGreeting
mengembalikan objekPromise<String>
daripada objekString
. Untuk mendapatkan nilai String yang dipegang olehPromise
, Anda menyebutnya metodeget()
. Namun, karena aktivitas sedang dijalankan secara asinkron, nilai kembalinya mungkin tidak segera siap;get()
akan meningkatkan pengecualian sampai nilai kembali dari metode asinkron tersedia.Untuk informasi selengkapnya tentang cara kerja
Promise
, lihat AWS Flow FrameworkKonsep Basic: Data Exchange antara aktivitas dan alur kerja.
getGreeting
membuat nilai kembali dengan melewati string ucapan ke metode Promise.asPromise
statis. Metode ini membuat objek Promise<T>
dari jenis yang sesuai, menetapkan nilai, dan menempatkan dalam status siap.
HelloWorldWorkflowAsync Alur kerja dan Host Aktivitas dan Starter
HelloWorldWorkflowAsync menerapkan GreeterWorker
sebagai kelas host untuk alur kerja dan aktivitas implementasi. Hal ini identik dengan pelaksanaan HelloWorldWorkflow kecuali untuk nama taskListToPoll
, yang diatur ke "HelloWorldAsyncList
".
import com.amazonaws.ClientConfiguration; import com.amazonaws.auth.AWSCredentials; import com.amazonaws.auth.BasicAWSCredentials; import com.amazonaws.services.simpleworkflow.AmazonSimpleWorkflow; import com.amazonaws.services.simpleworkflow.AmazonSimpleWorkflowClient; import com.amazonaws.services.simpleworkflow.flow.ActivityWorker; import com.amazonaws.services.simpleworkflow.flow.WorkflowWorker; public class GreeterWorker { public static void main(String[] args) throws Exception { ClientConfiguration config = new ClientConfiguration().withSocketTimeout(70*1000); String swfAccessId = System.getenv("AWS_ACCESS_KEY_ID"); String swfSecretKey = System.getenv("AWS_SECRET_KEY"); AWSCredentials awsCredentials = new BasicAWSCredentials(swfAccessId, swfSecretKey); AmazonSimpleWorkflow service = new AmazonSimpleWorkflowClient(awsCredentials, config); service.setEndpoint("https://swf.us-east-1.amazonaws.com"); String domain = "helloWorldWalkthrough"; String taskListToPoll = "HelloWorldAsyncList"; ActivityWorker aw = new ActivityWorker(service, domain, taskListToPoll); aw.addActivitiesImplementation(new GreeterActivitiesImpl()); aw.start(); WorkflowWorker wfw = new WorkflowWorker(service, domain, taskListToPoll); wfw.addWorkflowImplementationType(GreeterWorkflowImpl.class); wfw.start(); } }
HelloWorldWorkflowAsync mengimplementasikan alur kerja starter di GreeterMain
; itu identik dengan implementasi HelloWorldWorkflow.
Untuk menjalankan alur kerja, jalankan GreeterWorker
dan GreeterMain
, seperti dengan HelloWorldWorkflow.