From fd714a7b6a7b116cf6b2ee0f6ea9b895e7227e22 Mon Sep 17 00:00:00 2001 From: Morikiyo INOHA Date: Fri, 17 Nov 2023 15:49:15 +0900 Subject: [PATCH 1/4] =?UTF-8?q?feat:=20delayed=5Fcron=5Fjob=20=E3=82=92?= =?UTF-8?q?=E7=BD=AE=E3=81=8D=E6=8F=9B=E3=81=88=E3=82=8B=E3=82=BF=E3=82=B9?= =?UTF-8?q?=E3=82=AF=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../delayed_cron_job_manager.rb | 55 +++++++++++++++++++ lib/tasks/sg_fargate_rails.rake | 7 +++ 2 files changed, 62 insertions(+) create mode 100644 lib/sg_fargate_rails/delayed_cron_job_manager.rb diff --git a/lib/sg_fargate_rails/delayed_cron_job_manager.rb b/lib/sg_fargate_rails/delayed_cron_job_manager.rb new file mode 100644 index 0000000..bd306d9 --- /dev/null +++ b/lib/sg_fargate_rails/delayed_cron_job_manager.rb @@ -0,0 +1,55 @@ +class DelayedCronJobManager + class << self + def refresh! + DelayedCronJobManager.new.refresh! + end + + def cron_jobs + Delayed::Job.where.not(cron: nil) + end + end + + def refresh! + ActiveRecord::Base.transaction do + destroy_cron_jobs! + create_cron_jobs! + end + end + + private + + def destroy_cron_jobs! + DelayedCronJobManager.cron_jobs.find_each do |delayed_job| + # NOTE: 念のため cron が設定されていることを再チェック + if delayed_job.cron.present? + delayed_job.destroy! + end + end + end + + def create_cron_jobs! + cron_settings.each do |options| + job_class = options[:class] + job_class = options[:class].constantize unless job_class.is_a?(Class) + + unless job_class.is_a?(ActiveJob::Base) + raise '対応しているジョブクラスはActiveJobのみです' + end + + args = options[:args] + if args.blank? + job_class.set(cron: options[:cron]).perform_later + elsif args.is_a?(Array) + job_class.set(cron: options[:cron]).perform_later(*args) + elsif args.is_a?(Hash) + job_class.set(cron: options[:cron]).perform_later(**args) + else + raise 'args オプションが不正です' + end + end + end + + def cron_settings + [] # WIP: 設定ファイルからロードする + end +end diff --git a/lib/tasks/sg_fargate_rails.rake b/lib/tasks/sg_fargate_rails.rake index 860ee9e..062e6c6 100644 --- a/lib/tasks/sg_fargate_rails.rake +++ b/lib/tasks/sg_fargate_rails.rake @@ -29,4 +29,11 @@ namespace :sg_fargate_rails do ) end end + + desc 'Refresh Delayed Cron Jobs' + task refresh_delayed_cron_jobs: :environment do + Rails.logger.info('[refresh_delayed_cron_jobs] refresh begin...') + DelayedCronJobManager.refresh! + Rails.logger.info('[refresh_delayed_cron_jobs] refresh end.') + end end From f33e88507df6189b42ff9d1577b939f0f7d8d66d Mon Sep 17 00:00:00 2001 From: Morikiyo INOHA Date: Fri, 17 Nov 2023 17:02:04 +0900 Subject: [PATCH 2/4] fix: DelayedCronJobManager MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit SgFargateRails module にいれる --- .../delayed_cron_job_manager.rb | 86 ++++++++++--------- lib/sg_fargate_rails/railtie.rb | 2 + lib/tasks/sg_fargate_rails.rake | 2 +- 3 files changed, 47 insertions(+), 43 deletions(-) diff --git a/lib/sg_fargate_rails/delayed_cron_job_manager.rb b/lib/sg_fargate_rails/delayed_cron_job_manager.rb index bd306d9..eea6dfe 100644 --- a/lib/sg_fargate_rails/delayed_cron_job_manager.rb +++ b/lib/sg_fargate_rails/delayed_cron_job_manager.rb @@ -1,55 +1,57 @@ -class DelayedCronJobManager - class << self - def refresh! - DelayedCronJobManager.new.refresh! - end - - def cron_jobs - Delayed::Job.where.not(cron: nil) - end - end +module SgFargateRails + class DelayedCronJobManager + class << self + def refresh! + DelayedCronJobManager.new.refresh! + end - def refresh! - ActiveRecord::Base.transaction do - destroy_cron_jobs! - create_cron_jobs! + def cron_jobs + Delayed::Job.where.not(cron: nil) + end end - end - private - - def destroy_cron_jobs! - DelayedCronJobManager.cron_jobs.find_each do |delayed_job| - # NOTE: 念のため cron が設定されていることを再チェック - if delayed_job.cron.present? - delayed_job.destroy! - end + def refresh! + ActiveRecord::Base.transaction do + destroy_cron_jobs! + create_cron_jobs! end end - def create_cron_jobs! - cron_settings.each do |options| - job_class = options[:class] - job_class = options[:class].constantize unless job_class.is_a?(Class) + private - unless job_class.is_a?(ActiveJob::Base) - raise '対応しているジョブクラスはActiveJobのみです' + def destroy_cron_jobs! + DelayedCronJobManager.cron_jobs.find_each do |delayed_job| + # NOTE: 念のため cron が設定されていることを再チェック + if delayed_job.cron.present? + delayed_job.destroy! + end end + end - args = options[:args] - if args.blank? - job_class.set(cron: options[:cron]).perform_later - elsif args.is_a?(Array) - job_class.set(cron: options[:cron]).perform_later(*args) - elsif args.is_a?(Hash) - job_class.set(cron: options[:cron]).perform_later(**args) - else - raise 'args オプションが不正です' + def create_cron_jobs! + cron_settings.each do |options| + job_class = options[:class] + job_class = options[:class].constantize unless job_class.is_a?(Class) + + unless job_class.is_a?(ActiveJob::Base) + raise '対応しているジョブクラスはActiveJobのみです' + end + + args = options[:args] + if args.blank? + job_class.set(cron: options[:cron]).perform_later + elsif args.is_a?(Array) + job_class.set(cron: options[:cron]).perform_later(*args) + elsif args.is_a?(Hash) + job_class.set(cron: options[:cron]).perform_later(**args) + else + raise 'args オプションが不正です' + end end end - end - def cron_settings - [] # WIP: 設定ファイルからロードする - end + def cron_settings + [] # WIP: 設定ファイルからロードする + end + end end diff --git a/lib/sg_fargate_rails/railtie.rb b/lib/sg_fargate_rails/railtie.rb index c19f66a..d7a6030 100644 --- a/lib/sg_fargate_rails/railtie.rb +++ b/lib/sg_fargate_rails/railtie.rb @@ -4,6 +4,8 @@ require 'sg_fargate_rails/remote_ip' require 'sg_fargate_rails/task_protection' +# FIXME: DelayedCronJob が定義されていたら sg_fargate_rails/delayed_cron_job_manager を require する + module SgFargateRails class Railtie < ::Rails::Railtie rake_tasks do diff --git a/lib/tasks/sg_fargate_rails.rake b/lib/tasks/sg_fargate_rails.rake index 062e6c6..8fed1ab 100644 --- a/lib/tasks/sg_fargate_rails.rake +++ b/lib/tasks/sg_fargate_rails.rake @@ -33,7 +33,7 @@ namespace :sg_fargate_rails do desc 'Refresh Delayed Cron Jobs' task refresh_delayed_cron_jobs: :environment do Rails.logger.info('[refresh_delayed_cron_jobs] refresh begin...') - DelayedCronJobManager.refresh! + SgFargateRails::DelayedCronJobManager.refresh! Rails.logger.info('[refresh_delayed_cron_jobs] refresh end.') end end From 3120d83f22a2531af994736f83242298f25e2bff Mon Sep 17 00:00:00 2001 From: Morikiyo INOHA Date: Fri, 24 Nov 2023 15:14:30 +0900 Subject: [PATCH 3/4] fix: delayed_cron_job settings --- ...manager.rb => delayed_cron_job_utility.rb} | 26 ++++++++++--------- lib/sg_fargate_rails/railtie.rb | 3 +-- lib/tasks/sg_fargate_rails.rake | 2 +- 3 files changed, 16 insertions(+), 15 deletions(-) rename lib/sg_fargate_rails/{delayed_cron_job_manager.rb => delayed_cron_job_utility.rb} (68%) diff --git a/lib/sg_fargate_rails/delayed_cron_job_manager.rb b/lib/sg_fargate_rails/delayed_cron_job_utility.rb similarity index 68% rename from lib/sg_fargate_rails/delayed_cron_job_manager.rb rename to lib/sg_fargate_rails/delayed_cron_job_utility.rb index eea6dfe..1d17932 100644 --- a/lib/sg_fargate_rails/delayed_cron_job_manager.rb +++ b/lib/sg_fargate_rails/delayed_cron_job_utility.rb @@ -1,8 +1,8 @@ module SgFargateRails - class DelayedCronJobManager + class DelayedCronJobUtility class << self - def refresh! - DelayedCronJobManager.new.refresh! + def refresh_cron_jobs! + DelayedCronJobUtility.new.refresh_cron_jobs! end def cron_jobs @@ -10,7 +10,13 @@ def cron_jobs end end - def refresh! + def initialize + unless defined?(::DelayedCronJob) + raise 'DelayedCronJob not defined.' + end + end + + def refresh_cron_jobs! ActiveRecord::Base.transaction do destroy_cron_jobs! create_cron_jobs! @@ -20,7 +26,7 @@ def refresh! private def destroy_cron_jobs! - DelayedCronJobManager.cron_jobs.find_each do |delayed_job| + DelayedCronJobUtility.cron_jobs.find_each do |delayed_job| # NOTE: 念のため cron が設定されていることを再チェック if delayed_job.cron.present? delayed_job.destroy! @@ -29,14 +35,10 @@ def destroy_cron_jobs! end def create_cron_jobs! - cron_settings.each do |options| + cron_settings.each do |_name, options| job_class = options[:class] job_class = options[:class].constantize unless job_class.is_a?(Class) - unless job_class.is_a?(ActiveJob::Base) - raise '対応しているジョブクラスはActiveJobのみです' - end - args = options[:args] if args.blank? job_class.set(cron: options[:cron]).perform_later @@ -45,13 +47,13 @@ def create_cron_jobs! elsif args.is_a?(Hash) job_class.set(cron: options[:cron]).perform_later(**args) else - raise 'args オプションが不正です' + raise 'invalid args option.' end end end def cron_settings - [] # WIP: 設定ファイルからロードする + @cron_settings ||= Rails.application.config_for('delayed_cron_jobs') end end end diff --git a/lib/sg_fargate_rails/railtie.rb b/lib/sg_fargate_rails/railtie.rb index d7a6030..770fc56 100644 --- a/lib/sg_fargate_rails/railtie.rb +++ b/lib/sg_fargate_rails/railtie.rb @@ -1,11 +1,10 @@ require 'sg_fargate_rails/adjust_cloudfront_headers' +require 'sg_fargate_rails/delayed_cron_job_utility' require 'sg_fargate_rails/healthcheck' require 'sg_fargate_rails/maintenance' require 'sg_fargate_rails/remote_ip' require 'sg_fargate_rails/task_protection' -# FIXME: DelayedCronJob が定義されていたら sg_fargate_rails/delayed_cron_job_manager を require する - module SgFargateRails class Railtie < ::Rails::Railtie rake_tasks do diff --git a/lib/tasks/sg_fargate_rails.rake b/lib/tasks/sg_fargate_rails.rake index 8fed1ab..02421c5 100644 --- a/lib/tasks/sg_fargate_rails.rake +++ b/lib/tasks/sg_fargate_rails.rake @@ -33,7 +33,7 @@ namespace :sg_fargate_rails do desc 'Refresh Delayed Cron Jobs' task refresh_delayed_cron_jobs: :environment do Rails.logger.info('[refresh_delayed_cron_jobs] refresh begin...') - SgFargateRails::DelayedCronJobManager.refresh! + SgFargateRails::DelayedCronJobUtility.refresh_cron_jobs! Rails.logger.info('[refresh_delayed_cron_jobs] refresh end.') end end From 21b2d8be828a05a6673e9d784541ff6abeb5d94b Mon Sep 17 00:00:00 2001 From: Morikiyo INOHA Date: Fri, 1 Dec 2023 15:09:30 +0900 Subject: [PATCH 4/4] =?UTF-8?q?update:=20DelayedCronJob=20=E3=81=8C?= =?UTF-8?q?=E5=AE=9A=E7=BE=A9=E3=81=95=E3=82=8C=E3=81=A6=E3=81=84=E3=82=8B?= =?UTF-8?q?=E3=81=A8=E3=81=8D=E3=81=A0=E3=81=91=20refresh=5Fdelayed=5Fcron?= =?UTF-8?q?=5Fjobs=20=E3=82=92=E3=82=BF=E3=82=B9=E3=82=AF=E3=81=AB?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/sg_fargate_rails/railtie.rb | 1 - lib/tasks/sg_fargate_rails.rake | 13 ++++++++----- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/lib/sg_fargate_rails/railtie.rb b/lib/sg_fargate_rails/railtie.rb index 770fc56..c19f66a 100644 --- a/lib/sg_fargate_rails/railtie.rb +++ b/lib/sg_fargate_rails/railtie.rb @@ -1,5 +1,4 @@ require 'sg_fargate_rails/adjust_cloudfront_headers' -require 'sg_fargate_rails/delayed_cron_job_utility' require 'sg_fargate_rails/healthcheck' require 'sg_fargate_rails/maintenance' require 'sg_fargate_rails/remote_ip' diff --git a/lib/tasks/sg_fargate_rails.rake b/lib/tasks/sg_fargate_rails.rake index 02421c5..585fbb4 100644 --- a/lib/tasks/sg_fargate_rails.rake +++ b/lib/tasks/sg_fargate_rails.rake @@ -30,10 +30,13 @@ namespace :sg_fargate_rails do end end - desc 'Refresh Delayed Cron Jobs' - task refresh_delayed_cron_jobs: :environment do - Rails.logger.info('[refresh_delayed_cron_jobs] refresh begin...') - SgFargateRails::DelayedCronJobUtility.refresh_cron_jobs! - Rails.logger.info('[refresh_delayed_cron_jobs] refresh end.') + if defined?(::DelayedCronJob) + require 'sg_fargate_rails/delayed_cron_job_utility' + desc 'Refresh Delayed Cron Jobs' + task refresh_delayed_cron_jobs: :environment do + Rails.logger.info('[refresh_delayed_cron_jobs] refresh begin...') + SgFargateRails::DelayedCronJobUtility.refresh_cron_jobs! + Rails.logger.info('[refresh_delayed_cron_jobs] refresh end.') + end end end