0

我有一個Adpapter類的集合,可以連接到各種API,哪些不是。下面是每個適配器是如何建立一個簡單的,一般的例子:Ruby錯誤處理:拯救子類中的異常

class AmazonAdapter 
    include Sidekiq::Worker 
    def perform(id) 
     get_results_from_api(id) 
    end 
end 

class WalmartAdapter 
    include Sidekiq::Worker 
    def perform(id) 
     get_results_from_api(id) 
    end 
end 

所以一般情況下,通過調用AmazonAdapter.new(500),它會連接到API並返回受你傳遞什麼作爲ID的結果。這是Sidekiq收集過程的一部分,並作爲後臺作業運行,所以它不一定會拋出明顯的異常或錯誤,以便在出現問題時提醒我。

我想使用AirBrake的通知系統在API沒有正確連接或者引發其他錯誤時通知我,但是沒有停止收集過程或sidekiq。我希望將錯誤處理和通知系統主流化。

的幾點思考我是要創建一個父類的子類可以繼承看起來類似於這樣:

class Adapter 
    include Sidekiq::Worker 
    def perform(id) 
     begin 
      #execute subclass perform method 
     rescue Exception => e 
      Airbrake.notify(e) 
     end 
    end 
end 

但我不是去了解這一點的最好辦法真正確定。我真的可以使用這個建議或幫助,謝謝!

回答

0

Sidekiq有一個瓶頸,它基本上執行一切:Sidekiq::Processor#execute_job,它接收兩個參數(worker, cloned_args),隨後調用worker.perform(*cloned_args)。所以,你的目的,我會去的模塊前面加上它:

Sidekiq::Processor.prepend(Module.new do 
    def execute_job(worker, cloned_args) 
    super # CALL ORIGINAL 
    rescue => e # NEVER RESCUE FROM EXCEPTION!!! 
    Airbrake.notify(e) # NOTIFY 
    raise e # RE-RAISE SO SIDEKIQ DOES HIS JOB 
    end 
end) 

呼叫這第一份工作之前,就大功告成了:所有的錯誤,發生在Sidekiq的呼喚工人正在airbraked。

希望它有幫助。

+0

謝謝!我會試試這個。我明白你永遠不想拯救一個例外。但是我正在運行一個應用程序來完成一件事,那就是通過管道系統收集數據(用光纖/線程實現)。一旦一名工作人員被解僱,它同時發動了數百個工作,而且這是一次邊檢,我沒有收到沒有發生的收集通知。我不一定希望它拋出異常,因爲我想讓工人繼續工作。當你說「如此sidekiq做他的工作」,你的意思是讓他繼續重新工作? – sclem72

+0

'當你說「所以sidekiq做他的工作」時,你的意思是讓他繼續重試工作嗎? - 是的。 Sidekiq將根據'Worker'實現中指定的'retry:true | false'參數重試或靜默跳過重試。順便說一句,'Exception'的救援沒有多大意義,因爲'OutOfMemory'和其他'Exception'通常不可操作。 – mudasobwa

0

我使用類似的結構來提醒我某些chron作業失敗並ping一個鬆弛通道,但最好的部分是它不需要繼承!這方面的一個天真的版本將是這個樣子:

class AirbrakeNotifier 
    def safe_run 
    yield 
    rescue StandardError => e 
    log_error(e) 
    raise e 
    end 

    private 

    def log_error(e) 
    # do your logging here 
    end 
end 

然後你的員工會是這個樣子:

class AmazonAdapter 
    include Sidekiq::Worker 

    def perform(id) 
    AirbrakeNotifier.new.safe_run { get_results_from_api(id) } 
    end 
end 

這給你更多的靈活性來配置你想不同的方式記錄每班,每個流程,或者真的你可以想到!

+1

嘿德文!好久不見,希望一切都好!太棒了,我要去看看這個! – sclem72