2011-08-17 22 views

Trả lời

12

Bạn có thể xây dựng phương pháp helper của riêng bạn trong Groovy để đóng gói thử lại logic này.

def retry(int times = 5, Closure errorHandler = {e-> log.warn(e.message,e)} 
    , Closure body) { 
    int retries = 0 
    def exceptions = [] 
    while(retries++ < times) { 
    try { 
     return body.call() 
    } catch(e) { 
     exceptions << e 
     errorHandler.call(e) 
    }   
    } 
    throw new MultipleFailureException("Failed after $times retries", exceptions) 
} 

(Giả sử một định nghĩa của MultipleFailureException tương tự như GPars' AsyncException)

sau đó trong mã, bạn có thể sử dụng phương pháp này như sau.

retry { 
    errorProneOperation() 
} 

hay, với một số lượng khác nhau của lần thử lại và hành vi xử lý lỗi:

retry(2, {e-> e.printStackTrace()}) { 
    errorProneOperation() 
} 
+1

Bây giờ nếu 'IllegalStateException' sẽ sử dụng một trong những trường hợp ngoại lệ (người đầu tiên cuối cùng khó để nói?) Như nguyên nhân của nó, nó sẽ được ** nhiều ** hữu ích hơn, như bạn có thể thấy ** tại sao ** nó không thành công. Trong sản xuất, tôi sẽ không muốn một stacktrace được in mỗi khi một nỗ lực thất bại. Tôi chỉ muốn biết về nó nếu mọi lần thử lại thất bại. –

+0

Cảm ơn Joachim - về đề nghị của bạn tôi đã thêm vào trong việc thu thập các ngoại lệ riêng lẻ. Đối với không muốn một stacktrace - chắc chắn, nó chỉ có để minh họa cho điểm. Khi các ngoại lệ hiện đang được thu thập để báo cáo ở cuối, có lẽ mục đích của errorHandler là đặt lại bất kỳ tài nguyên nào được yêu cầu trước khi 'body.call()' được thử lại - trong trường hợp đó, đóng cửa mặc định chỉ có thể là '{->} ' – winstaan74

+0

Tôi đã sử dụng một cái gì đó rất giống nhau. cảm ơn winstaan. –

1

Những ngày này mọi người sẽ khuyên bạn sử dụng ScheduledExecutorService để thực hiện loại chức năng try-catch-retry này, vì Thread.sleep() được coi là lỗi thời và có khả năng không tốt cho hiệu suất. Tôi sẽ chỉ cho bạn một câu trả lời tốt về điều này bởi cletus, nhưng không thể cho cuộc sống của tôi tìm thấy nó. Tôi sẽ cập nhật câu trả lời của mình nếu tôi có thể khai thác nó.

EDIT: tìm thấy nó: How to retry function request after a certain time Hy vọng rằng đây là một số trợ giúp cho bạn.

1

tôi có thể đề nghị thi đua kinda giống nhau (Tôi không chắc chắn về ngữ nghĩa của retry):

def retry(handler, c) { 
    try { 
     c() 
    } catch(e) { 
     handler(e) 
     retry(handler, c) // restart from beginning 
    } 
} 

def handler = {e -> 
    // handles error 
} 

retry(handler) { 
    do_something // exception raised 
} 
Các vấn đề liên quan