

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
<a name="swf-sns-tutorial-implementing-activities-poller"></a>

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](https://docs.aws.amazon.com/AWSRubySDK/latest/AWS/SimpleWorkflow/ActivityTaskCollection.html#poll-instance_method) pada [activity\_tasks](https://docs.aws.amazon.com/AWSRubySDK/latest/AWS/SimpleWorkflow/Domain.html#activity_tasks-instance_method) 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](https://docs.aws.amazon.com/AWSRubySDK/latest/AWS/SimpleWorkflow/ActivityTask.html#activity_type-instance_method) 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\!)](https://docs.aws.amazon.com/AWSRubySDK/latest/AWS/SimpleWorkflow/ActivityTask.html#complete!-instance_method) maupun [fail\! (gagal\!)](https://docs.aws.amazon.com/AWSRubySDK/latest/AWS/SimpleWorkflow/ActivityTask.html#fail!-instance_method) pada tugas berdasarkan kode yang kembali.

**catatan**  
Kode ini keluar dari poller setelah kegiatan akhir diluncurkan, karena telah menyelesaikan misinya dan telah meluncurkan semua kegiatan. 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 **ActivitiesPoller**kelas kita, tetapi kita akan menambahkan sedikit lebih banyak 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 Beerlangganan: Menjalankan Alur Kerja](swf-sns-tutorial-running-the-workflow.md).