Ruby on Rails 5.2 - ActiveJob::Exceptions::ClassMethods

मॉड्यूल ActiveJob :: अपवाद :: ClassMethods




ruby

मॉड्यूल ActiveJob :: अपवाद :: ClassMethods

सार्वजनिक प्रवृत्ति के तरीके

त्याग_न (अपवाद) {| स्व, त्रुटि | ...} स्रोत दिखाएं
# File activejob/lib/active_job/exceptions.rb, line 79
def discard_on(exception)
  rescue_from exception do |error|
    if block_given?
      yield self, error
    else
      logger.error "Discarded #{self.class} due to a #{exception}. The original exception was #{error.cause.inspect}."
    end
  end
end

यदि अपवाद को उठाया जाता है, तो फिर से प्रयास करने के बिना नौकरी छोड़ दें। यह उपयोगी है जब नौकरी के विषय, एक सक्रिय रिकॉर्ड की तरह, अब उपलब्ध नहीं है, और नौकरी इस प्रकार अब प्रासंगिक नहीं है।

आप किसी ऐसे ब्लॉक को भी पास कर सकते हैं जिसे आमंत्रित किया जाएगा। इस ब्लॉक को पहले उदाहरण के रूप में नौकरी के उदाहरण के साथ और दूसरे पैरामीटर के रूप में त्रुटि उदाहरण के साथ प्राप्त किया जाता है।

उदाहरण

class SearchIndexingJob < ActiveJob::Base
  discard_on ActiveJob::DeserializationError
  discard_on(CustomAppException) do |job, error|
    ExceptionNotifier.caught(error)
  end

  def perform(record)
    # Will raise ActiveJob::DeserializationError if the record can't be deserialized
    # Might raise CustomAppException for something domain specific
  end
end
Retry_on (अपवाद, प्रतीक्षा करें: 3. सेकंड, प्रयास: 5, कतार: nil, प्राथमिकता: nil) {@ स्व, त्रुटि | ...} स्रोत दिखाएं
# File activejob/lib/active_job/exceptions.rb, line 45
def retry_on(exception, wait: 3.seconds, attempts: 5, queue: nil, priority: nil)
  rescue_from exception do |error|
    if executions < attempts
      logger.error "Retrying #{self.class} in #{wait} seconds, due to a #{exception}. The original exception was #{error.cause.inspect}."
      retry_job wait: determine_delay(wait), queue: queue, priority: priority
    else
      if block_given?
        yield self, error
      else
        logger.error "Stopped retrying #{self.class} due to a #{exception}, which reoccurred on #{executions} attempts. The original exception was #{error.cause.inspect}."
        raise error
      end
    end
  end
end

इतने सेकंड के बाद पुन: निष्पादन के लिए अपवाद और पुनर्निर्धारित नौकरी पकड़ो, विशिष्ट प्रयासों के लिए। यदि अपवाद को निर्दिष्ट प्रयासों की संख्या से परे रखा जा रहा है, तो अपवाद को अंतर्निहित कतार प्रणाली तक बुलबुला करने की अनुमति है, जिसका अपना स्वयं का पुनर्प्रयास तंत्र हो सकता है या निरीक्षण के लिए होल्डिंग कतार में रख सकता है।

तुम भी एक ब्लॉक पारित कर सकते हैं कि आह्वान किया जाएगा अगर पुन: प्रयास प्रयास अपवाद तर्क के लिए अपवाद बबल अप करने के बजाय विफल। इस ब्लॉक को पहले उदाहरण के रूप में नौकरी के उदाहरण के साथ और दूसरे पैरामीटर के रूप में त्रुटि उदाहरण के साथ प्राप्त किया जाता है।

विकल्प

  • :wait - एक सेकंड (डिफ़ॉल्ट: 3 सेकंड) में निर्दिष्ट देरी के साथ नौकरी को फिर से लागू करता है, एक कंप्यूटिंग खरीद के रूप में कि एक तर्क के रूप में अब तक निष्पादन की संख्या, या एक प्रतीक के संदर्भ के रूप में: घातीय_ लंबा, जो प्रतीक्षा लागू करता है एल्गोरिथ्म (executions ** 4) + 2 (पहले प्रतीक्षा 3s, फिर 18s, फिर 83s, आदि)

  • :attempts - कार्य को निर्दिष्ट समय को फिर से लागू करता है (डिफ़ॉल्ट: 5 प्रयास)

  • :queue - एक अलग कतार पर नौकरी को फिर से लागू करता है

  • :priority - एक अलग प्राथमिकता के साथ नौकरी को फिर से लागू करता है

उदाहरण

class RemoteServiceJob < ActiveJob::Base
  retry_on CustomAppException # defaults to 3s wait, 5 attempts
  retry_on AnotherCustomAppException, wait: ->(executions) { executions * 2 }
  retry_on(YetAnotherCustomAppException) do |job, error|
    ExceptionNotifier.caught(error)
  end
  retry_on ActiveRecord::Deadlocked, wait: 5.seconds, attempts: 3
  retry_on Net::OpenTimeout, wait: :exponentially_longer, attempts: 10

  def perform(*args)
    # Might raise CustomAppException, AnotherCustomAppException, or YetAnotherCustomAppException for something domain specific
    # Might raise ActiveRecord::Deadlocked when a local db deadlock is detected
    # Might raise Net::OpenTimeout when the remote service is down
  end
end