From 79a76bc9df2188d213d2195420a250b5cbee7ff1 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Mon, 21 Aug 2023 15:11:51 +0700 Subject: [PATCH] refactor: use MutexApplicationJob --- app/jobs/send_on_slack_job.rb | 18 ++---------------- app/jobs/webhooks/facebook_events_job.rb | 6 +++++- 2 files changed, 7 insertions(+), 17 deletions(-) diff --git a/app/jobs/send_on_slack_job.rb b/app/jobs/send_on_slack_job.rb index da535ed3c..b978310b2 100644 --- a/app/jobs/send_on_slack_job.rb +++ b/app/jobs/send_on_slack_job.rb @@ -1,24 +1,10 @@ -class SendOnSlackJob < ApplicationJob - class LockAcquisitionError < StandardError; end - +class SendOnSlackJob < MutexApplicationJob queue_as :medium retry_on LockAcquisitionError, wait: 3.seconds, attempts: 5 def perform(message, hook) - lock_key = format(::Redis::Alfred::SLACK_MESSAGE_MUTEX, sender_id: message.sender_id, reference_id: hook.reference_id) - lock_manager = Redis::LockManager.new - - if lock_manager.locked?(lock_key) - Rails.logger.error "[SendOnSlackJob] Failed to acquire lock on attempt #{executions + 1}: #{lock_key}" - raise LockAcquisitionError, "Failed to acquire lock for key: #{lock_key}" - end - - begin - Rails.logger.info "[SendOnSlackJob] Acquired lock for: #{lock_key}" + with_lock(::Redis::Alfred::SLACK_MESSAGE_MUTEX, sender_id: message.sender_id, reference_id: hook.reference_id) do Integrations::Slack::SendOnSlackService.new(message: message, hook: hook).perform - ensure - # Ensure that the lock is released even if there's an error in processing - lock_manager.unlock(lock_key) end end end diff --git a/app/jobs/webhooks/facebook_events_job.rb b/app/jobs/webhooks/facebook_events_job.rb index 8d212d686..17415ba64 100644 --- a/app/jobs/webhooks/facebook_events_job.rb +++ b/app/jobs/webhooks/facebook_events_job.rb @@ -1,8 +1,12 @@ class Webhooks::FacebookEventsJob < ApplicationJob queue_as :default + retry_on LockAcquisitionError, wait: 2.seconds, attempts: 5 def perform(message) response = ::Integrations::Facebook::MessageParser.new(message) - ::Integrations::Facebook::MessageCreator.new(response).perform + + with_lock(::Redis::Alfred::FACEBOOK_MESSAGE_MUTEX, sender_id: response.sender_id, recipient_id: response.recipient_id) do + ::Integrations::Facebook::MessageCreator.new(response).perform + end end end