Cron Job với gem Whenever kết hợp Active Job trong Rails

Tram Ho

Thời gian gần đây mình có làm dự án và mình có đụng 1 task “Tự động tạo ngày nghỉ hằng năm cho nhân viên sau khi kết thúc lịch đăng kí cho phép”. Tức là cái task phải set thời gian chạy theo lịch cài đặt là sau khi kết thúc thời gian đăng kí lịch nghỉ. Mình có lên mạng và tìm hiểu về set thời gian chạy tự động trong linux có cron job và tất cả nhiêm vụ sẽ được ghi ở crontab, và trong rails có hỗ trợ gem whenever. Mình có tìm hiểu gem whenever và sử dụng kết hợp với Active Job của Rails để phục vụ cho giải pháp của task.

Triển khai

Gem whenever

Gem whenever là một gem trong rails giúp triển khai thực hiện cronjobs trong linux, thực hiện công việc tự động hóa theo chu kì mà ta có thể cấu hình. Khi sử dụng gem whenever thì cũng giống như trên terminal ở linux ta sử dụng crontab -e để add công việc và hẹn lịch chạy, vấn đề mấu chốt là ở đó. Hãy hiểu whenever là 1 cái đồng hồ báo thức và chúng ta có thể cài đặt thời gian trong schedule.rb


Mình đã add thủ công bằng tay công việc vào crontab với câu lệnh 0 1 * * * ~/Hoc/Rails/Project/SUN*/wsm_02/config/schedule.rb tức là vào 1:00 am hắng ngày sẽ chạy file schedule.rb

Đó là thực hiện bằng tay, bây giờ chúng ta cùng triển khai gem whenever để thực hiện công việc này 1 cách tự động từ ban đầu.

Ta tiến hành add vào Gemfile, sau đó chạy bundle install

hoặc

để cài đặt gem. Sau đó ta chạy lệnh

Một file config/schedule.rb sẽ được tạo. File này là nơi mà mình sẽ cài đặt cấu hình công việc cần chạy định kì.

Tất nhiên linux sẽ không tự hiểu được mỗi sự thay đổi của file schedule.rb mà chúng ta phải thực hiện cập nhật schedule vào crontab bằng lệnh

Cấu hình trong file schedule.rb

Một vài cách cài đặt thời gian chạy công việc

Ý nghĩa các con số 15 0 1 12 * và các dấu * xem đoạn giải thích sau:

Vậy 15 0 1 12 * tức là hẹn lịch cho 0h 15 phút ngày 1 tháng 12 hằng năm sẽ chạy task.

Các bạn có thể thấy ở trên có các kiểu chạy Job khác nhau như: rake hay là runner, command và script

  • rake: Chạy các rake task của Rails app
  • runner: Chạy các class method của Rails app
  • command: Chạy các command của linux
  • script: Chạy script file

Có thể cài log của crontab bằng cách setup trong file schedule.rb:

Cấu hình 1 file rake

Mỗi ngày vào lúc 1h sáng đều có lịch để chạy rake “auto_create_dayoff_plan:enforcement”

end_register_date: Ngày cài đặt của hệ thống cho phép nhân viên tự đăng kí ngày nghỉ

Cấu hình Job

Ba đoạn code trên có nghĩa là khi kết thúc ngày cho phép đăng kí(end_register_date) hàng tháng thì ActiveJob(CreateDayoffPlanJob) sẽ được kích hoạt. Mọi việc sau đó chỉ là nhiệm vụ chạy Job mà ActiveJob đảm nhiệm và công việc trong Service AutoCreateDayoffPlanService sẽ được thực hiện. Đã có bài viết trên viblo viết về ActiveJob rồi, mình sẽ để link đây mọi người vào đọc.

Kết

Trên đây là sự tìm hiểu và vận dụng của mình về gem whenever. Khi những task yêu cầu sự chạy tự động, lập lịch chạy theo một thời điểm cố định trong tương lai thì chúng ta hãy dùng gem này. Bài viết với sự tìm hiểu trong khi làm task nên có thể có những chỗ hiểu sai, mong bạn đọc có thể góp ý phần comment để cùng nhau xây dựng thêm sự hoàn thiện cho bạn đọc sau.

Chia sẻ bài viết ngay

Nguồn bài viết : Viblo