2012-10-09 2 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 

else 문에서 "delayed RefundJob has failed"를 발생 시키면 Airbrake이 생성됩니다. else 섹션에서 끝나면 작업을 다시 실행하고 싶습니다.지연된 작업으로 인해 오류가 발생할 때마다 에어 브레이크가 생성됩니다.

예외를 발생시키지 않고 작업을 다시 대기시킬 수있는 방법이 있습니까? 그리고 에어 브레이크를 만들지 못하게합니까? 내가 delayed_job 버전 1.

답변

0

DelayedJob을 사용하고

는 작업이 정의에 의해, 다시 대기열에 오류를 올릴 것으로 기대하고있다.

거기에서 다음 중 하나를 수행 할 수 있습니다 :

나중에 해결책에 관해서는 세 번째 또는 나중의 시도에서 에어 브레이크 보고서를 채우는 메커니즘을 추가하는 것이 좋습니다. 시도로 인해 로그가 가득 차는 번거 로움없이 여전히 문제가 있음을 감지 할 수 있습니다.

+0

철저한 답변을 가져 주셔서 감사합니다. 일정 변경 방법에 관해서는, 내 인상은 그것이 실패했을 때 내 일정이 재조정된다는 것입니다 (오류가 발생하지 않는다면 제 것이 합격 할 것입니다). –

2

가장 깨끗한 방법은 새 작업을 만들고 대기열에 추가 한 다음 정상적으로 종료하는 것입니다.

+0

그 문제는 새 작업이 else 루프에도 끝날 수 있다는 것입니다. (그 시작과 비슷합니다.) 즉, 3 레벨 작업을 생성해야한다는 의미입니다. –

+0

맞습니다. 이 접근법의 문제점은 무엇입니까? – Roman

1

@ Roman의 응답에 대해 자세히 설명하려면 retry 매개 변수를 사용하여 새 작업을 만들고이를 대기열에 추가 할 수 있습니다.

retry 매개 변수를 유지하면 (작업을 다시 대기열에 추가 할 때마다 증가시킵니다) 재 시도 횟수를 추적 할 수 있으므로 무한 재 시도 루프가 발생하지 않습니다.

관련 문제