Tutorial Alur Kerja Langganan Bagian 4: Menerapkan Poller Tugas Aktivitas - Amazon Simple Workflow Service

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Tutorial Alur Kerja Langganan Bagian 4: Menerapkan Poller Tugas Aktivitas

Di Amazon SWF, tugas aktivitas untuk eksekusi alur kerja yang berjalan muncul di daftar tugas aktivitas, yang disediakan saat Anda menjadwalkan aktivitas di alur kerja.

Kita akan menerapkan poller aktivitas dasar untuk menangani tugas-tugas ini untuk alur kerja kita, dan menggunakannya untuk meluncurkan aktivitas kita ketika Amazon SWF menempatkan tugas pada daftar tugas aktivitas untuk memulai aktivitas.

Untuk memulai, buat file baru bernama swf_sns_activities.rb. Kita akan menggunakannya untuk:

  • Menginstansiasi kelas aktivitas yang telah kita buat.

  • Mendaftarkan setiap aktivitas dengan Amazon SWF.

  • Lakukan poll untuk aktivitas dan panggil do_activity untuk setiap aktivitas ketika namanya muncul di daftar tugas aktivitas.

Di swf_sns_activities.rb, tambahkan pernyataan berikut untuk mengharuskan masing-masing kelas aktivitas yang kita tentukan.

require_relative 'get_contact_activity.rb' require_relative 'subscribe_topic_activity.rb' require_relative 'wait_for_confirmation_activity.rb' require_relative 'send_result_activity.rb'

Sekarang, kita akan membuat kelas dan menyediakan beberapa kode inisialisasi.

class ActivitiesPoller def initialize(domain, workflowId) @domain = domain @workflowId = workflowId @activities = {} # These are the activities we'll run activity_list = [ GetContactActivity, SubscribeTopicActivity, WaitForConfirmationActivity, SendResultActivity ] activity_list.each do | activity_class | activity_obj = activity_class.new puts "** initialized and registered activity: #{activity_obj.name}" # add it to the hash @activities[activity_obj.name.to_sym] = activity_obj end end

Selain menyimpan domain dan daftar tugas yang diteruskan, kode ini menginstansiasi masing-masing kelas aktivitas yang kita buat. Karena setiap kelas mendaftarkan aktivitas terkait (lihat basic_activity.rb jika Anda perlu meninjau kode tersebut), hal ini sudah cukup untuk mengizinkan Amazon SWF mengetahui semua kegiatan yang akan kita jalankan.

Untuk setiap aktivitas yang diinstansiasi, kita menyimpannya di peta menggunakan nama aktivitas (seperti get_contact_activity) sebagai kunci, sehingga kita dapat dengan mudah mencarinya di kode poller aktivitas, yang akan kita tentukan selanjutnya.

Buat sebuah metode baru bernama poll_for_activities dan panggil poll pada activity_tasks yang dipegang oleh domain untuk mendapatkan tugas aktivitas.

def poll_for_activities @domain.activity_tasks.poll(@workflowId) do | task | activity_name = task.activity_type.name

Kita bisa mendapatkan nama aktivitas dari anggota activity_type tugas. Selanjutnya, kita akan menggunakan nama aktivitas yang terkait dengan tugas ini untuk mencari kelas untuk menjalankan do_activity, meneruskan tugasnya (yang mencakup data input yang harus dikirim ke aktivitas).

# find the task on the activities list, and run it. if @activities.key?(activity_name.to_sym) activity = @activities[activity_name.to_sym] puts "** Starting activity task: #{activity_name}" if activity.do_activity(task) puts "++ Activity task completed: #{activity_name}" task.complete!({ :result => activity.results }) # if this is the final activity, stop polling. if activity_name == 'send_result_activity' return true end else puts "-- Activity task failed: #{activity_name}" task.fail!( { :reason => activity.results[:reason], :details => activity.results[:detail] } ) end else puts "couldn't find key in @activities list: #{activity_name}" puts "contents: #{@activities.keys}" end end end end

Kode hanya menunggu do_activity diselesaikan, dan kemudian memanggil baik complete! (selesai!) maupun fail! (gagal!) pada tugas berdasarkan kode yang kembali.

catatan

Kode ini keluar dari poller setelah aktivitas akhir diluncurkan, karena telah menyelesaikan misinya dan telah meluncurkan semua aktivitas. Dalam kode Amazon SWF Anda sendiri, jika aktivitas Anda mungkin dijalankan lagi, Anda mungkin ingin menjaga poller aktivitas berjalan tanpa batas waktu.

Itulah akhir dari kode untuk kleas ActivitiesPoller kita, tapi kita akan menambahkan beberapa kode di akhir file untuk memungkinkan pengguna menjalankannya dari baris perintah.

if __FILE__ == $0 if ARGV.count < 1 puts "You must supply a task-list name to use!" exit end poller = ActivitiesPoller.new(init_domain, ARGV[0]) poller.poll_for_activities puts "All done!" end

Jika pengguna menjalankan file dari baris perintah (meneruskan daftar tugas aktivitas sebagai argumen pertama), kode ini akan menginstansiasi kelas poller dan memerintahkan kelas untuk melakukan polling untuk aktivitas. Setelah poller selesai (setelah meluncurkan aktivitas akhir), kita cukup mencetak pesan dan keluar.

Itu saja untuk poller aktivitas. Anda hanya perlu menjalankan kode dan melihat cara kerjanya, di Tutorial Alur Kerja Berlangganan: Menjalankan Alur Kerja.