Konteks Eksekusi - 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.

Konteks Eksekusi

Kerangka kerja ini memberikan konteks sekitar untuk alur kerja dan implementasi aktivitas. Konteks ini khusus untuk tugas yang sedang diproses dan menyediakan beberapa utilitas yang dapat Anda gunakan dalam pelaksanaan Anda. Sebuah objek konteks dibuat setiap kali tugas baru diproses oleh pekerja.

Konteks Keputusan

Ketika tugas keputusan dijalankan, kerangka kerja menyediakan konteks untuk implementasi alur kerja melalui kelas DecisionContext. DecisionContext menyediakan informasi konteks-sensitif seperti eksekusi alur kerja menjalankan Id dan jam dan fungsi timer.

Mengakses DecisionContext dalam Pelaksanaan alur kerja

Anda dapat mengakses DecisionContext dalam penerapan alur kerja Anda menggunakan kelas DecisionContextProviderImpl. Atau, Anda dapat menyuntikkan konteks di lapangan atau properti pelaksanaan alur kerja Anda menggunakan Spring seperti yang ditunjukkan di bagian injeksi Testabilitas dan Ketergantungan.

DecisionContextProvider contextProvider = new DecisionContextProviderImpl(); DecisionContext context = contextProvider.getDecisionContext();

Membuat Jam dan Timer

DecisionContext berisi properti tipe WorkflowClock yang menyediakan fungsi timer dan jam. Karena logika alur kerja harus deterministik, Anda sebaiknya tidak langsung menggunakan jam sistem dalam pelaksanaan alur kerja Anda. Metode currentTimeMills pada WorkflowClock mengembalikan waktu acara awal keputusan yang sedang diproses. Hal ini memastikan bahwa Anda mendapatkan nilai waktu yang sama selama replay, maka, membuat logika alur kerja Anda deterministik.

WorkflowClock juga memiliki metode createTimer yang mengembalikan sebuah objek Promise yang menjadi siap setelah interval tertentu. Anda dapat menggunakan nilai ini sebagai parameter untuk metode asinkron lainnya untuk menunda eksekusi mereka dengan jangka waktu tertentu. Dengan cara ini Anda dapat secara efektif menjadwalkan metode asinkron atau aktivitas untuk eksekusi di lain waktu.

Contoh dalam daftar berikut menunjukkan cara memanggil suatu aktivitas secara berkala.

@Workflow @WorkflowRegistrationOptions(defaultExecutionStartToCloseTimeoutSeconds = 60, defaultTaskStartToCloseTimeoutSeconds = 10) public interface PeriodicWorkflow { @Execute(version = "1.0") void periodicWorkflow(); } @Activities(version = "1.0") @ActivityRegistrationOptions(defaultTaskScheduleToStartTimeoutSeconds = 300, defaultTaskStartToCloseTimeoutSeconds = 3600) public interface PeriodicActivity { void activity1(); } public class PeriodicWorkflowImpl implements PeriodicWorkflow { private DecisionContextProvider contextProvider = new DecisionContextProviderImpl(); private WorkflowClock clock = contextProvider.getDecisionContext().getWorkflowClock(); @Override public void periodicWorkflow() { callPeriodicActivity(0); } @Asynchronous private void callPeriodicActivity(int count, Promise<?>... waitFor) { if (count == 100) { return; } PeriodicActivityClient client = new PeriodicActivityClientImpl(); // call activity Promise<Void> activityCompletion = client.activity1(); Promise<Void> timer = clock.createTimer(3600); // Repeat the activity either after 1 hour or after previous activity run // if it takes longer than 1 hour callPeriodicActivity(count + 1, timer, activityCompletion); } } public class PeriodicActivityImpl implements PeriodicActivity { @Override public void activity1() { ... } }

Dalam daftar di atas, metode asinkron callPeriodicActivity memanggil activity1 dan kemudian menciptakan timer menggunakan AsyncDecisionContext saat ini. Ini meneruskan kembali Promise sebagai argumen untuk panggilan rekursif untuk dirinya sendiri. Panggilan rekursif ini menunggu sampai timer menyala (1 jam dalam contoh ini) sebelum mengeksekusi.

Konteks Eksekusi Aktivitas

Sama seperti DecisionContext memberikan informasi konteks ketika tugas keputusan sedang diproses, ActivityExecutionContext menyediakan informasi konteks yang sama ketika tugas aktivitas sedang diproses. Konteks ini tersedia untuk kode aktivitas Anda melalui kelas ActivityExecutionContextProviderImpl.

ActivityExecutionContextProvider provider = new ActivityExecutionContextProviderImpl(); ActivityExecutionContext aec = provider.getActivityExecutionContext();

Menggunakan ActivityExecutionContext, Anda dapat melakukan hal berikut:

Heartbeat Aktivitas Berjalan Panjang

Jika aktivitas ini berjalan lama, itu harus secara berkala melaporkan kemajuan ke Amazon SWF untuk membiarkan ia tahu bahwa tugas masih membuat kemajuan. Dengan tidak adanya heartbeat seperti itu, tugas mungkin timeout jika tugas waktu habis heartbeat ditetapkan pada jenis aktivitas pendaftaran atau saat penjadwalan kegiatan. Untuk mengirim heartbeat, Anda dapat menggunakan metode recordActivityHeartbeat pada ActivityExecutionContext. Heartbeat juga menyediakan mekanisme untuk membatalkan aktivitas yang sedang berlangsung. Lihat bagian Penanganan Kesalahan untuk detai lebih lanjut dan contoh.

Dapatkan Detail Tugas Aktivitas

Jika Anda mau, Anda bisa mendapatkan semua detail tugas aktivitas yang disahkan oleh Amazon SWF saat pelaksana mendapat tugas. Ini termasuk informasi mengenai masukan untuk tugas, jenis tugas, tugas token, dll. Jika Anda ingin menerapkan aktivitas yang diselesaikan secara manual—misalnya, dengan tindakan manusia—maka Anda harus menggunakan ActivityExecutionContext untuk mengambil token tugas dan menyebarkannya ke proses yang akhirnya akan menyelesaikan tugas aktivitas. Lihat bagian di Menyelesaikan Aktivitas Secara Manual untuk lebih detailnya.

Dapatkan Amazon SWF Client Object yang Sedang Digunakan oleh Pelaksana

Objek klien Amazon SWF yang digunakan oleh pelaksana dapat diambil dengan memanggil metode getService pada ActivityExecutionContext. Hal ini berguna jika Anda ingin membuat panggilan langsung ke layanan Amazon SWF.