Secara umum manfaat penggunaan Active Job adalah sebagai wrapper background job processing sehingga memudahkan developer untuk menuliskan code secara general. Active job menerjemahkan syntax yang ditulis developer agar bisa dibaca background engine yang digunakan. Terdapat tiga kondisi yang biasanya dibutuhkan sebuah active job:
- Sebuah proses yang membutuhkan External API untuk melakukan proses.
- Sebuah proses yang memerlukan banyak perhitungan atau proses (contohnya memproses sebuah gambar).
- Mengirimkaan email atau posting ke media lain (social media, blog dll).
Agar semakin paham, kita akan langsung mencoba menerapkannya dalam sebuah aplikasi sederhana. Kita akan mencoba menghapus beberapa data sekaligus melalui active job dengan adapter Sidekiq.
Buat aplikasi sederhana
Pertama siapkan sebuah aplikasi sederhana dengan dua model yaitu model User dan model Article dimana user has many articles. Kemudian isikan beberapa data di dalamnya. Anda bisa memanfaatkan aplikasi yang sudah pernah kita buat di belajar bareng kita sebelumnya (kalau ketinggalan bisa klik di sini)
Install sidekiq
Setelah aplikasi sederhana sudah berjalan selanjutnya kita install dulu sidekiq di aplikasi kita, caranya dengan memasukan gem sidekiq ke dalam gemlist.
Lalu lakukan bundle install.
Setelah itu kita akan membuat config file untuk sidekiq. Buat sebuah file di path config dengan nama sidekiq.yml
config/sidekiq.yml
:pidfile: ./tmp/pids/sidekiq.pid
:logfile: ./log/sidekiq.log
:queues:
- default
Untuk mengecek apakah sidekiq sudah terinstall dengan benar, jalankan server ( $ rails s) kemudian buka tab baru dari path tersebut.
jalankan perintah:
Kalo tidak ada masalah seharusnya kurang lebih tampilannya akan seperti ini:
Jadi sekarang kita seolah-olah menjalankan dua server, satu untuk server rails dan yang satu untuk sidekiq. Biarkan keduanya berjalan namun bila ingin menghentikannya tinggal menekan kombinasi tombol Ctrl + C
Membuat active job
Secara otomatis akan terbentuk sebuah path baru di dalam app yaitu path jobs dan sudah ada satu file didalamnya dengan nama articles_cleanup_job.rb, kemudian kita isi file tersebut dengan code yang kurang lebih seperti ini:
app/jobs/articles_cleanup_job.rb
queue_as :default
def perform(user_id)
user = User.find(user_id)
count = 0
if user
puts "Prepare to Delete article form user #{user.name}"
articles = user.articles
if articles
articles.each do |article|
count += 1 if article.destroy
end
end
puts "Delete article finished, deleted articles = #{count}"
end
end
end
Keterangan:
Agar nanti kita bisa tahu sidekiq kita telah benar-benar mengeksekusi proses delete article, kita tambahkan puts "Prepare to Delete article form user #{user.name}" di awal proses dan puts "Delete article finished, deleted articles = #{count}" setelah proses selesai
Kemudian kita buat juga sebuah file di path config/initializers dengan nama active_job.rb lalu kita isi dengan code:
config/initiaizers/active_job.rb
Memanfaatkan active job di aplikasi
Pembuatan file active_job dan setup sidekiq sudah selesai, sekarang saatnya mencobanya pada aplikasi.
Saya akan memanfaatkan aplikasi yang sebelumnya dibuat pada sesi sebelumnya (klik di sini bila ingin membaca sesi sebelumnya), tinggal tambahkan sebuah model Article (isinya bebas) yang ber-relasi dengan model User, dimana user has_many articles.
Buat juga sebuah articles_controller dan sebuah method di controller tadi yang nanti berfungsi untuk memanggil active job tadi.
articles_controller.rb
def delete_articles
ArticlesCleanupJob.perform_later(params[:id])
redirect_to root_url
end
end
Jangan lupa untuk mendaftarkan path-nya di routes.rb
routes.rb
member do
get 'delete_articles'
end
end
Pada view/home/index.html.erb juga kita ubah sedikit untuk memanggil method delete_articles tadi
view/home/index.html.erb
Conglartulation, you login with facebook
</br>
<%= link_to "Delete All articles this user"
, delete_articles_article_path(current_user.id)%>
<%else%>
<%= link_to "Login with facebook", "auth/facebook"%>
<%end%>
Sekarang kita akan mencobanya, tapi sebelumnya kita isi dulu tabel article dengan beberapa dummy data, bisa diisi secara random namun yang perlu diingat user_id harus terisi dengan id user yang sudah ada.
Berikut tampilan sesudah login
Kemudian kita klik "Delete All articles this user". lalu cek di server aplikasi kita
Dari situ akan terlihat sebuah baris log:
Yang berarti active job kita sudah dijalankan dengan memanfaatkan sidekiq. Bisa kita buktikan dengan melihat server sidekiq
Yup, penanda awal proses dan setelah proses sudah tertulis, berarti sidekiq telah menjalankan proses penghapusan Articles untuk user tersebut.
Demikianlah pengenalan active_job pada rails 4 secara sederhana ini. Sebenarnya pembelajaran mengenai active joba baik teknik, maupun pemanfaatannya masih sangat luas sekali, dan mungkin akan kita pelajari bersama lain waktu.
Semoga belajar bareng kali ini bermanfaat dan Happy Coding (^.^)
Sumber:
- Active Job Basics
- How to Integrate Sidekiq With ActiveJob
- Gem Sidekiq