Rails da cron job ve whenever gem kullanımı

2017, Nov 15    

Cron’u ilk geçen yıl aldığım işletim sistemleri dersinde öğrenmiştim sonra biraz araştırınca hatırlayabildim. Cron tekrar eden görevlerin zamanlanmasına yardımcı olmak için Unix, Linux işletim sistemleri tarafından kullanılan görev planlayıcısıdır. Sistem tarafından tekrar eden görevleri belirlediğimiz zaman aralıklarında çalışmasını sağlar.

Rails uygulamalarında da belirli görevleri planlamak için cron’u kullanabiliriz. Örneğin istenilen zamanlarda mail atma ya da veritabanından hergün oluşan artık kayıtları silme vs. Bu tür işlemleri gerçekleştirebilmek için cron job ve whenever gem’ini birlikte kullanabiliriz. Bu yazıda daha çok rails tarafını anlatacağım ama cron’un nasıl kullanıldığını öğrenmek için şuraya bakabilirsin.

Whenever Gem

whenever gem insanların okuyabileceği formatta cron jobları yazmamıza olanak sağlar.

1) Kurulum
Gem file dosyamızın içerisine whenever gem’ini ekliyoruz.

gem 'whenever', require: false

Ardından

bundle install

komutunu koşuyoruz.

2) Kullanımı
Proje dosyamızın içerisinde whenever’ı Initialise ediyoruz.

wheneverize .

Yukarıdaki komutu çalıştırdığımızda rails projemizin içinde config/schedule.rb adında bir dosya oluşturuyor. Hangi işlemlerin ve ne sıklıkla gerçekleştirileceğini bu dosyanın içerisine belirtiyoruz. Örneğin bu örnekte hergün saat 01:00 da veritabanımızdaki bütün veri customerları silmek istiyoruz. Bunu aşağıdaki şekilde belirtiriz. (Buradaki set :output ifadesi işlemlerin doğru çalışıp çalışmadığını kontrol etmek için belirtildi.)

Şimdi ise yapılacak işlemi tanımlamaya geçelim.

3) Rake Task Oluşturma
Cron tasklerini, whenever gem’ini kullanarak otomatik olarak çalışacak şekilde ayarlamanın birkaç yolu var. Fakat burada yanlızca kolay bir yöntem olan rake task oluşturmadan bahsedeceğim. Öncelikle projemizin içerisine bir rake dosyası oluşturalım. lib/tasks/delete_customers.rake Ve içeriğini şu şekilde dolduralım.

Yukarıdaki kodlarda rake’e özgü birkaç anahtar keyword kullanılmakta. Buradaki namespace:task kombinasyonu ile rake taks’ini nasıl çağıracağımızı belirtiriz. Bunu rails db:migrate örneği ile bağdaştıracak olursak “db” ‘namespace’ alanına “migrate” de ‘task’ alanına karşılık gelmektedir. Şimdi rake’i yazdığımıza göre artık console da kullanmayı deneyebiliriz.

rake delete:customers

Artık her saat 01:00 da bütün müşterileri silen bir cron jon’umuz var. Bunun doğru çalışıp çalışmadığını kontrol etmek için testini de yazabiliriz. Normalde unit testinin yazılması gerekiyor ama ben request testlerinin içerisine yazıyorum. Öncelikle spec/requests/customers_request_spec.rb dosyamızın içerisine gidip bir describe blogu tanımlayalım. Ve içeriği şu şekilde olsun.

Burada before do blogunun içerisinde işlem gerçekleştirilmeden önce yapılacak olayları belirtiyoruz. Öncelikle 9 tane customer oluşturduk ve Timecop.freeze ile zamanı sabitledik. (Timecop rails uygulamalarında zamanı yönetebilme imkanı sağlıyor. Detaylı bilgi için şurada bakabilirsiniz.) Ardından lib klasörün içerisine yazdığımız rake dosyamızı testlerimizin içerisine yüklüyoruz. Ve bir environment tanımlıyoruz. it blogunun içerisinde ise yapılacak işi ve sonucunu kontrol ediyoruz. Blog içinde belirttiğiz “task” ifadesine yarattığımız rake’in task’ini atıyoruz. expect blogunda yapılan işlemi tanımlıyoruz. Burada oluşturduğumuz task’i çağırdık ve bu task çalıştığında oluşturduğumuz 9 customer’ın silinip silinmediğini kontrol ettik. Son olarak ise zamanı serbest bıraktık.

İşlemlerimiz burada bitti. Eğer yazıda bir hata ya da eksik olduğunu düşünüyorsan yorum olarak belirtmeni çok isterim.

Sevgiler

Kaynaklar
http://eewang.github.io/
http://jameshuynh.com/