2012-10-09 29 views
7
def perform 
    refund_log = { 
    success: refund_retry.success?, 
    amount: refund_amount, 
    action: "refund" 
    } 
    if refund_retry.success? 
    refund_log[:reference] = refund_retry.transaction.id 
    refund_log[:message] = refund_retry.transaction.status 
    else 
    refund_log[:message] = refund_retry.message 
    refund_log[:params] = {} 
    refund_retry.errors.each do |error| 
     refund_log[:params][error.code] = error.message 
    end 
    order_transaction.message = refund_log[:params].values.join('|') 
    raise "delayed RefundJob has failed" 
    end 
end 

बढ़ाएं, जब मैं "देरी RefundJob में नाकाम रही है" और बयान में उठाती बनाने, यह एक Airbrake पैदा करता है। अगर मैं दूसरे खंड में समाप्त होता हूं तो मैं नौकरी फिर से चलाने के लिए चाहता हूं।विलंबित नौकरी airbrakes हर बार यह एक त्रुटि

क्या कोई अपवाद उठाए बिना नौकरी फिर से कतारबद्ध करने का कोई तरीका है? और एक एयरब्रैक बनाने से रोकें?

मैं delayed_job संस्करण का उपयोग कर रहा 1.

उत्तर

0

DelayedJob एक नौकरी, requeued को एक त्रुटि जुटाने की परिभाषा से उम्मीद है।

वहां से आप कर सकते हैं:

  • airbrake ओर अपने execpetion पर ध्यान न दें, जहाँ आप https://github.com/tobi/delayed_job/blob/master/lib/delayed/job.rb#L65 है कि एक पर देख सकते हैं देख https://github.com/airbrake/airbrake#filtering तो यह अभी भी DelayedJob कोड में अपने लॉग
  • गोता न भरने की स्थिति फिर से पंक्तिबद्ध हो जाता है विधि reschedule उपलब्ध है और run_with_lock (https://github.com/tobi/delayed_job/blob/master/lib/delayed/job.rb#L99) द्वारा उपयोग और उपयोग किया जाता है। वहां से आप अपना अपवाद बढ़ाने के बजाय मैन्युअल रूप से रीशेड्यूल को कॉल कर सकते हैं।

बारे में बाद में समाधान, मैं कुछ तंत्र है कि अभी भी या तीसरे पर एक airbrake रिपोर्ट को भरने के बाद में प्रयास, आप अभी भी पता लगा सकते हैं कि कुछ प्रयास के द्वारा भरा अपने लॉग होने की परेशानी के बिना गलत है जोड़ने की सलाह।

+0

पूरी तरह से उत्तर के लिए धन्यवाद। रीशेड्यूल विधि के संबंध में, मेरी धारणा यह है कि जब कोई नौकरी विफल हो जाती है तो यह पुन: निर्धारित होता है (अगर मैं त्रुटि नहीं उठा रहा हूं तो मेरा पास होगा।) क्या मैं यहां सही हूं? –

2

सबसे साफ तरीका फिर से कतार करना होगा, यानी एक नया काम बनाएं और इसे दबाएं, और फिर सामान्य रूप से विधि से बाहर निकलें।

+0

इसके साथ समस्या यह है कि नया काम अन्य लूप में भी समाप्त हो सकता है (इसकी शुरुआत की तरह), जिसका अर्थ है कि मुझे तीसरे स्तर की नौकरी बनाना होगा, और –

+0

पर यह सही है। इस दृष्टिकोण के साथ क्या समस्या है? – Roman

1

@ रोमन की प्रतिक्रिया पर विस्तृत करने के लिए, आप retry पैरामीटर के साथ एक नया काम बना सकते हैं, और इसे एनक्यू्यू कर सकते हैं।

यदि आप retry पैरामीटर बनाए रखते हैं (प्रत्येक बार जब आप नौकरी फिर से संलग्न करते हैं तो इसे बढ़ाएं), आप ट्रैक कर सकते हैं कि आपने कितनी रीट्री बनाई हैं, और इस प्रकार एक अंतहीन पुनः प्रयास लूप से बचें।