Aplikasi HelloWorldWorkflowAsync - AWS Flow Framework untuk Java

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 nilai Promise<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:

  1. Eksekusi aktivitas getName, yang segera mengembalikan objek Promise<String>, name, yang mewakili nama.

  2. Panggil metode asinkron getGreeting dan meneruskan objek name. getGreeting dengan segera mengembalikan objek Promise<String>, greeting, yang mewakili ucapan.

  3. Eksekusi aktivitas say dan meneruskan objek greeting.

  4. Saat getName lengkap, name telah siap dan getGreeting menggunakan nilainya untuk membangun ucapan.

  5. Saat getGreeting lengkap, greeting telah siap dan say 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 objek Promise<String> daripada objek String. Untuk mendapatkan nilai String yang dipegang oleh Promise, Anda menyebutnya metode get(). 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.asPromisestatis. 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.