diff --git a/Gemfile.lock b/Gemfile.lock index 6bb9201..4a90046 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - rabbit_carrots (0.1.17) + rabbit_carrots (0.1.19) bunny (>= 2.19.0) connection_pool (~> 2.3.0) @@ -15,7 +15,7 @@ GEM tzinfo (~> 2.0) amq-protocol (2.3.2) ast (2.4.2) - bunny (2.20.3) + bunny (2.22.0) amq-protocol (~> 2.3, >= 2.3.1) sorted_set (~> 1, >= 1.0.2) concurrent-ruby (1.1.10) diff --git a/lib/rabbit_carrots.rb b/lib/rabbit_carrots.rb index 9826ae6..953d5dd 100644 --- a/lib/rabbit_carrots.rb +++ b/lib/rabbit_carrots.rb @@ -18,6 +18,8 @@ module RabbitCarrots class NackAndRequeueMessage < StandardError end + + class PlaceholderError < Error; end end end end diff --git a/lib/rabbit_carrots/tasks/rmq.rake b/lib/rabbit_carrots/tasks/rmq.rake index 780a4e8..6706b7b 100644 --- a/lib/rabbit_carrots/tasks/rmq.rake +++ b/lib/rabbit_carrots/tasks/rmq.rake @@ -5,6 +5,10 @@ namespace :rabbit_carrots do task eat: :environment do Rails.application.eager_load! + DatabaseAgonsticNotNullViolation = defined?(ActiveRecord) ? ActiveRecord::NotNullViolation : RabbitCarrots::EventHandlers::Errors::PlaceholderError + DatabaseAgonsticConnectionNotEstablished = defined?(ActiveRecord) ? ActiveRecord::ConnectionNotEstablished : Mongo::Error::SocketError + DatabaseAgnosticRecordInvalid = defined?(ActiveRecord) ? ActiveRecord::RecordInvalid : Mongoid::Errors::Validations + channels = RabbitCarrots.configuration.routing_key_mappings.map do |mapping| # This will be supplied in initializer. At that time, the Handler will not be available to be loaded and will throw Uninitialized Constant { **mapping, handler: mapping[:handler].constantize } @@ -47,11 +51,11 @@ def run_task(queue_name:, queue_arguments: {}, handler_class:, routing_keys:) rescue RabbitCarrots::EventHandlers::Errors::NackAndRequeueMessage => _e Rails.logger.info "Nacked and Requeued message: #{payload}" channel.nack(delivery_info.delivery_tag, false, true) - rescue ActiveRecord::NotNullViolation, ActiveRecord::RecordInvalid => e + rescue DatabaseAgonsticNotNullViolation, DatabaseAgnosticRecordInvalid => e # on null constraint violation, we want to ack the message Rails.logger.error "Null constraint or Invalid violation: #{payload}. Error: #{e.message}" channel.ack(delivery_info.delivery_tag, false) - rescue ActiveRecord::ConnectionNotEstablished => e + rescue DatabaseAgonsticConnectionNotEstablished => e # on connection not established, we want to requeue the message and sleep for 3 seconds Rails.logger.error "Error connection not established to the database: #{payload}. Error: #{e.message}" # delay for 3 seconds before requeuing